Назад | Перейти на главную страницу

Предлагают ли таблицы InnoDB или MyISAM лучшую производительность вставки в MySQL 5.1?

Мне нужно как можно быстрее вставлять строки в базу данных со только что созданными таблицами и без индексов. Я смотрю порядка 20 миллионов строк, что не так уж и много. Могут ли таблицы InnoDB или MyISAM дать мне лучшую производительность?

Очевидно, есть и другие приемы пакетной загрузки, на которые я обращаю внимание.

InnoDB является транзакционным, поэтому MyISAM, который не беспокоится об атомарной записи, будет быстрее.

MyISAM будет быстрее, чем InnoDB в описанном вами случае. Если вы просто хотите как можно быстрее перенести данные в MySQL, посмотрите ЗАГРУЗИТЬ ДАННЫЕ В ФАЙЛ.

Вот кое-что, о чем еще никто не упомянул.

Если вы конвертируете формат строки таблиц MyISAM из ДИНАМИЧЕСКОГО (по умолчанию) в ФИКСИРОВАННЫЙ, вы можете увеличить общую производительность SQL по сравнению с таблицей как минимум на 20%.

В соответствии с страницы 71-73 проекта MySQL Database Design and Tuning (ISBN 0-672-32756-1), просто выполните следующую команду в любой таблице MyISAM:

ALTER TABLE tblname ROW_FORMAT=FIXED;

и вы получите хороший прирост производительности ваших запросов к этой таблице.

В примере, приведенном в книге, говорится, что запросы к таблице MyISAM с ДИНАМИЧЕСКИМИ строками выполняются на 50% дольше, чем к таблице MyISAM с фиксированными строками. Если затем взять таблицу MyISAM с фиксированными строками и сжать ее с помощью myisampack, сжатая таблица MyISAM с фиксированными строками будет запрашивать на 10% быстрее, чем несжатая таблица MyISAM с фиксированными строками.

У такого подхода есть серьезный недостаток ??? Таблица MyISAM с фиксированными строками как минимум в два раза больше, чем ее аналоги MyISAM с динамическими строками. Итак, если вы можете позволить себе компромисс между скоростью и пространством, вам следует использовать таблицы MyISAM с фиксированными строками. Тогда все запросы будут выполняться быстрее без каких-либо дополнительных изменений структуры таблицы.

Вы также можете запустить ALTER TABLE имя таблицы ROW_FORMAT = FIXED; против таблицы InnoDB. Если бы вы сделали это с таблицами в механизмах хранения InnoDB и MyISAM, у вас все равно не было бы равных условий игры. Край всегда будет переходить в MyISAM. Причина ??? Все поиски по неуникальному индексу должны проходить через некластеризованный индекс, а затем через кластерный индекс для доступа к rowid. Индексы MyISAM проходят не более одного индекса.

Я не просто догадываюсь об этом. Около 4 лет назад я лично взял таблицу размером 2 ГБ, запустил ALTER TABLE и расширил ее до 3,7 ГБ. Все полученные запросы выполнялись в среднем на 20% быстрее, чем они выполнялись до изменения формата строки.

Я настоятельно рекомендую сделать это для всех MyISAM и InnoDB, если вы хотите повысить производительность и не возражаете против увеличения размеров файлов.