哪个列首先放在索引中?基数更高还是更低?

时间:2012-09-07 09:35:33

标签: mysql indexing query-optimization cardinality

例如,如果我的表格中包含citystate列,那么使用该索引的最佳方式是什么?

显然city将具有最高的基数,所以我应该将该列放在索引中,我应该放置状态还是不重要?

2 个答案:

答案 0 :(得分:2)

MySQL复合索引查找必须按索引中定义列的顺序进行。由于您希望MySQL能够通过执行尽可能少的比较来区分记录,并且所有其他条件相同,您将从复合索引中获益最多,其中列从最高到最低基数排序。

也就是说,假设最终必须对最高基数列进行比较才能区分记录,为什么在最终可能没有必要的情况下,首先对最低基数列进行强制比较呢?

答案 1 :(得分:2)

在这种情况下无关紧要

INDEX cs (city, state),
INDEX sc (state, city)

WHERE city = 'Atlanta'
  AND state = 'Georgia'

使用任何一个索引,BTree中的向下钻取将是同样的努力,您将以同样快的速度进入一行。

WHERE中的条款顺序无关紧要。)

(如果您使用“范围”测试而不是=测试,那就是a different Question。)