Ars Longa, Vita Brevis

Сравнение скорости выполнения INSERT/INSERT DELAYED для таблиц типа HEAP (MEMORY), InnoDB и MyISAM

Я сейчас работаю над очень интересным проектом, который, как надеется заказчик, составит серьёзную конкуренцию Google Analytics. Но речь не об этом. Разбираясь с архитектурой системы, я обнаружил весьма интересную деталь: 8 гигабайт памяти сервера отдается под несколько таблиц типа HEAP. Так как HEAP-таблицы хранятся в исключительно в памяти, то операция вставки (INSERT) должна выполняться очень быстро, так как временные затраты, связанные с перемещением головок диска и физической записью, отсутствуют. Я решил найти подтверждение этой теории. Google is your friend, и я довольно быстро нашел статью MySQL Engine INSERT speed.

Меня несколько смутили результаты, приведённые автором:

Смутило, в первую очередь, жуткое отставание InnoDB: хотя я не очень часто использовал данный тип таблиц, о его скорости я наслышан.

Первыми возникшими вопросами были:

  1. Какой тип вставки использовался для MyISAM/InnoDB-таблиц — INSERT или INSERT DELAYED?
  2. Каким образом вставлялись данные — построчно или блочно (extended insert)?
  3. Значение AUTOCOMMIT при работе с таблицей InnoDB.

Об этом оставалось только гадать, поэтому я решил повторить этот эксперимент.

Методика эксперимента:
Создаются три таблицы:

[-]
View Code MySQL
CREATE TABLE `test0` (
    `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;

Перед началом эксперимента выполнялась команда

[-]
View Code M