在索引中应该先放置哪一列?高基数还是低基数?

3
例如,如果我有一个带有citystate列的表格,最好的使用索引的方法是什么?
显然,city具有最高的基数,因此我应该在索引中首先放置该列,还是应该放置state列,或者并不重要?
2个回答

4

在这种情况下,这并不重要:

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

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

使用任何一个索引,BTree的钻取过程都是相同的,你将以同样的速度到达这一行。

(WHERE子句中的顺序无关紧要。)

(如果您正在使用“范围”测试而不是=测试,那么这是另一个问题。)


3

MySQL的复合索引查询必须按照索引中定义的列的顺序进行。由于您希望MySQL能够通过尽可能少的比较区分记录,在所有其他条件相等的情况下,您将从具有从最高基数到最低基数排序的列的复合索引中获得最大的收益。

也就是说,假设最终必须根据最高基数的列来区分记录,为什么要强制先对最低基数的列进行比较,而最终可能是不必要的呢?


1
抱歉,但我不同意。原因有几个:使用基数较低的索引是否有意义? - ypercubeᵀᴹ
2
@ypercubeᵀᴹ - 我认为那个链接不同 -- 它讨论的是单列索引;而这里的问题是关于复合索引的。 - Rick James
问题是,但那里的答案涵盖了多列索引中低基数列首先有用的情况。 - ypercubeᵀᴹ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接