这是一个惊人的巨大性能差异,但我可以想到一些可能有所贡献的事情.
MyISAM在历史上被视为比InnoDB更快,但对于最新版本的InnoDB,对于更小,更小的用例集来说也是如此.对于只读表的表扫描,MyISAM通常更快.在大多数其他用例中,我通常发现InnoDB更快.通常快很多倍.在我使用MySQL的大部分时间里,表锁是MyISAM的丧钟.
MyISAM在其密钥缓冲区中缓存索引.也许您已经将密钥缓冲区设置得太小,无法有效地缓存大型表的索引.
MyISAM依赖于OS来缓存OS磁盘缓存中的.MYD文件中的表数据.如果操作系统内存不足,它将开始转储其磁盘缓存.这可能会迫使它继续从磁盘读取.
InnoDB将索引和数据缓存在自己的内存缓冲区中.如果将innodb_flush_method设置为O_DIRECT,则可以告诉操作系统不要使用其磁盘缓存,但OS X不支持此操作.
InnoDB通常在16kb页面中缓冲数据和索引.根据您在查询之间更改@eid值的方式,由于来自先前查询的磁盘读取,它可能已经缓存了一个查询的数据.
确保以相同方式创建索引.使用explain来检查MySQL是否正在使用索引.由于您包含了describe的输出而不是show create table或show indexes from,我无法判断entity_id是否是复合索引的一部分.如果它不是复合索引的第一部分,则不会使用它.
如果您使用的是相对现代版本的MySQL,请在运行查询之前运行以下命令:
set profiling = 1;
这将打开您的会话的查询分析.运行查询后,运行
显示档案;
这将显示可用配置文件的查询列表.我认为它默认保留最后20个.假设您的查询是第一个,请运行:
显示查询1的个人资料;
然后,您将看到运行查询的每个阶段的持续时间.这对于确定什么(例如,表锁定,排序,创建临时表等)导致查询变慢非常有用.