例如,如果我有一个带有 acity
和一state
列的表,那么使用索引的最佳方法是什么?
显然city
将具有最高的基数,所以我应该将该列放在索引中的第一位,我应该放置状态还是无关紧要?
例如,如果我有一个带有 acity
和一state
列的表,那么使用索引的最佳方法是什么?
显然city
将具有最高的基数,所以我应该将该列放在索引中的第一位,我应该放置状态还是无关紧要?
MySQL 复合索引查找必须按照在索引中定义列的顺序进行。由于您希望 MySQL 能够通过执行尽可能少的比较来区分记录,在所有其他条件相同的情况下,您将从复合索引中受益最大,其中列从最高基数到最低基数排序。
也就是说,假设最终必须针对最高基数列执行比较以区分记录,为什么在最终可能没有必要的情况下强制比较首先针对最低基数列?
在这种情况下没关系:
INDEX cs (city, state),
INDEX sc (state, city)
WHERE city = 'Atlanta'
AND state = 'Georgia'
使用任一索引,在 BTree 中的向下钻取将是相同的努力,并且您会以同样快的速度到达一行。
(子句的顺序WHERE
无关紧要。)
(如果您使用的是“范围”测试而不是=
测试,那么这是一个不同的问题。)