Во-первых, ваш тест недействителен , поскольку увеличение скорости блокировки на уровне строки по сравнению с блокировкой на уровне таблицы происходит при наличии параллелизма! Если в одной вставке используется только одна нить, то в обоих случаях для каждой вставки предусмотрена одна блокировка / разблокировка, и вставки не ожидают снятия блокировки на уровне таблицы.
Секунды, как утверждает JIStone, непоследовательный первичный ключ снижает производительность для вставок, когда размер таблицы больше пула буферов.
В-третьих, размер пула буферов является одним из наиболее важных параметров в InnoDB. Сделайте его как можно меньше (рекомендуемое значение 80% от доступной оперативной памяти).
Далее, как утверждает @wallyk, innodb_flush_log_at_trx_commit играют решающую роль в скорости операций ввода-вывода.
Далее важны innodb_log_file_size и innodb_buffer_file_size.
Далее, имейте в виду, что, поскольку у вас есть 2 уникальных индекса, прежде чем InnoDB сможет вставить строку, он должен проверить наличие значения в индексах, и ваши индексы велики.
Не имея подробных сведений о таблице и индексах, я не могу дать вам больше советов, но имейте в виду, что ни один механизм хранения не является панацеей, и хотя зачастую вы можете набрать большую скорость, просто изменив механизм хранения, добавив Индекс, или настройка одной переменной, в крупных системах все сложнее, чем эта. Но, как я уже сказал, вам не следует сравнивать необработанную скорость вставки в изолированном тесте, вы должны сделать свой тест максимально приближенным к реальному приложению.
обновление : еще один совет
Как в MyISAM, так и в InnoDB, мульти-вставка (вставка в .... значения (...), (...), (...)) выполняется быстрее. Кроме того, в InnoDB вы можете вносить вставки в транзакцию, которая отключает обновление неуникальных индексов до завершения транзакции, а также быстрее (но не выполняет большие транзакции, поскольку это на самом деле замедлит работу из-за используемого уровня изоляции и как работает версионирование строк).