3

例如,如果我有一个带有 acity和一state列的表,那么使用索引的最佳方法是什么?

显然city将具有最高的基数,所以我应该将该列放在索引中的第一位,我应该放置状态还是无关紧要?

4

2 回答 2

3

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

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

于 2012-09-07T09:41:48.800 回答
3

在这种情况下没关系:

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

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

使用任一索引,在 BTree 中的向下钻取将是相同的努力,并且您会以同样快的速度到达一行。

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

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

于 2018-05-08T17:49:14.923 回答