我有一个大的ish InnoDB表(大约800 to ),我想数数行。我知道SELECT COUNT(*)在InnoDB中存在问题,但我看到的解决方案之一是创建辅助索引,它比仔细研究PRIMARY要快得多,至少在行计数方面是如此。
我已经将表内容复制到第二台服务器。服务器的速度更快,当然,复制的结果是一个很好的、紧凑的表,没有被删除和更新。因此,在新服务器上,一切都很好,而且速度很快,但是关于旧服务器行为的一些东西仍然令我困惑:
我有一个PRIMARY索引,另一个索引(称为index2)已经在表中定义了。在旧服务器(MySQL 5.0.27)上,我可以使用EXPLAIN SELECT COUNT(*) FROM myTable并看到它将使用PRIMARY索引。查询需要超过一分钟。如果我SELECT COUNT(*) FROM myTable USE INDEX(index2),它需要100毫秒。如果我使用WHERE someCol > lowest_possible_value,它也会选择更快的索引。
在新服务器(MySQL 5.1.52)上,相同的EXPLAIN语句告诉我它将使用index2,没有任何提示。一个简单的SELECT COUNT(*) FROM myTable是非常快的,在20-30 is左右。我可以运行SELECT COUNT(*) FROM myTable USE INDEX(PRIMARY),强制它使用“坏”指数,它需要更长的时间--只有3-4秒,但是正如我所说的,还有其他的差异可以解释,而且这仍然比“好”(非PRIMARY)指数慢了一百多倍。
为什么较新的MySQL实例选择“正确”索引?我可以在旧服务器上做一些事情来复制这种行为吗?我现在想避免完全升级,但这并不是不可能的。
发布于 2012-08-14 09:57:30
有两种可能性:
修复前者可能与ANALYZE TABLE一样简单;修复后者只是一个包升级。
https://serverfault.com/questions/417305
复制相似问题