【发布时间】:2011-09-17 13:07:28
【问题描述】:
我从MySQL Performance Blog 中了解到,根据查询的选择性,全表扫描可能比索引扫描更快。考虑到这些知识,我根据我之前的post 在一个有 500 万行的表上尝试了一个具有 12 个WHERE 条件和一个HAVING 条件的查询。我观察到全表扫描(7.7sec)仍然比具有 3% 选择性(161341/ 5000000)。
我的问题是:“为什么选择性为 3% 的索引扫描仍然比全表扫描慢 20 倍?有没有办法让索引扫描更快?”
【问题讨论】:
-
对于上述比较,我在运行查询之前做了一个
echo 3 > /proc/sys/vm/drop_caches来刷新系统缓存。如果我不刷新缓存,则使用索引扫描的后续查询总是更快。Flush tables命令在这里不影响查询速度。 -
在对您之前帖子的评论中说,上面的执行时间是在 SQL 的第一次执行时测量的。如果你多次执行它们,性能差异是否相同?
-
@Klas Lindbäck:如果我每次在每次查询之前都进行一次刷新(参见我的第一条评论),那么索引扫描总是比完全扫描慢得多。
-
这个问题似乎与如何将表加载到缓存中有关。当您执行全表扫描时,使用顺序读取读取表。我的猜测是,当您使用索引时,将按照它们在索引中出现的顺序读取块,即非顺序。但这取决于您的存储解决方案。