Сравнение скорости выполнения INSERT/INSERT DELAYED для таблиц типа HEAP (MEMORY), InnoDB и MyISAM
Я сейчас работаю над очень интересным проектом, который, как надеется заказчик, составит серьёзную конкуренцию Google Analytics. Но речь не об этом. Разбираясь с архитектурой системы, я обнаружил весьма интересную деталь: 8 гигабайт памяти сервера отдается под несколько таблиц типа HEAP. Так как HEAP-таблицы хранятся в исключительно в памяти, то операция вставки (INSERT) должна выполняться очень быстро, так как временные затраты, связанные с перемещением головок диска и физической записью, отсутствуют. Я решил найти подтверждение этой теории. Google is your friend, и я довольно быстро нашел статью MySQL Engine INSERT speed.
Меня несколько смутили результаты, приведённые автором:
- MyISAM (с
DELAY_KEY_WRITE=ALL
): 33 000 INSERT/сек - InnoDB: 24 700 INSERT/сек
- MEMORY: 64 000 INSERT/сек
Смутило, в первую очередь, жуткое отставание InnoDB: хотя я не очень часто использовал данный тип таблиц, о его скорости я наслышан.
Первыми возникшими вопросами были:
- Какой тип вставки использовался для MyISAM/InnoDB-таблиц —
INSERT
илиINSERT DELAYED
? - Каким образом вставлялись данные — построчно или блочно (extended insert)?
- Значение
AUTOCOMMIT
при работе с таблицей InnoDB.
Об этом оставалось только гадать, поэтому я решил повторить этот эксперимент.
Методика эксперимента:
Создаются три таблицы:
`field` INTEGER UNSIGNED NOT NULL
) TYPE=HEAP;
CREATE TABLE `test1` (
`field` INTEGER UNSIGNED NOT NULL
) TYPE=InnoDB;
CREATE TABLE `test2` (
`field` INTEGER UNSIGNED NOT NULL
) TYPE=MyISAM DELAY_KEY_WRITE=1;
Перед началом эксперимента выполнялась команда