Это удивительно большая разница в производительности, но я могу подумать о нескольких вещах, которые могут помочь.
MyISAM исторически считался более быстрым, чем InnoDB, но для последних версий InnoDB это справедливо для гораздо меньшего набора вариантов использования. MyISAM обычно быстрее для сканирования таблиц только для чтения. В большинстве других случаев я нахожу InnoDB быстрее. Часто в разы быстрее. Блокировки таблиц являются смертельным звеном для MyISAM в большинстве случаев использования MySQL.
MyISAM кэширует индексы в своем ключевом буфере. Возможно, вы установили слишком маленький буфер ключей, чтобы он эффективно кэшировал индекс для вашей довольно большой таблицы.
MyISAM зависит от ОС для кэширования данных таблицы из файлов .MYD в кеше диска ОС. Если в операционной системе недостаточно памяти, она начнет выгружать свой дисковый кеш. Это может заставить его продолжать чтение с диска.
InnoDB кэширует как индексы, так и данные в своем собственном буфере памяти. Вы можете указать ОС не использовать ее дисковый кеш, если для innodb_flush_method установлено значение O_DIRECT, хотя это не поддерживается в OS X.
InnoDB обычно буферизует данные и индексы на страницах по 16 КБ. В зависимости от того, как вы меняете значение @eid между запросами, возможно, он уже кэшировал данные для одного запроса из-за чтения диска с предыдущего запроса.
Убедитесь, что вы создали индексы одинаково. Используйте объяснение, чтобы проверить, использует ли MySQL индекс. Так как вы включили вывод команды description вместо show create table или show indexers, я не могу сказать, является ли entity_id частью составного индекса. Если бы это была не первая часть составного индекса, он бы не использовался.
Если вы используете относительно современную версию MySQL, перед запуском запроса выполните следующую команду:
установить профилирование = 1;
Это включит профилирование запросов для вашего сеанса. После выполнения запроса выполните
показывать профили;
Это покажет вам список запросов, для которых доступны профили. Я думаю, что он сохраняет последние 20 по умолчанию. Предполагая, что ваш запрос был первым, запустите:
показать профиль для запроса 1;
Затем вы увидите продолжительность каждого этапа выполнения запроса. Это чрезвычайно полезно для определения того, что (например, блокировки таблиц, сортировка, создание временных таблиц и т. Д.) Вызывает медленный запрос.