Мне нужно как можно быстрее вставлять строки в базу данных со только что созданными таблицами и без индексов. Я смотрю порядка 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, если вы хотите повысить производительность и не возражаете против увеличения размеров файлов.