对于不同基数列的复合索引,订单是否重要?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对于不同基数列的复合索引,订单是否重要?相关的知识,希望对你有一定的参考价值。

对于使用复合b树索引 SELECT * from customers where gender = 'M' AND date_of_birth < '2000-01-01' 的所有列的查询

CREATE INDEX low_then_high ON customer (gender, date_of_birth); CREATE INDEX high_then_low ON customer (date_of_birth, gender); 之间有区别吗?

类似的问题是How to pair low/high cardinality columns as composite indexes?,但接受的答案没有解释推荐背后的原因。

我问的是mysql,但我猜这个答案适用于任何b-tree索引。

答案

没有。多列INDEXes中的基数无关紧要。但是,列的使用确实很重要。

索引中的第一列需要使用=进行测试。在那之后,你得到一个“范围”的裂缝,如<BETWEENIN处于灰色区域,有时像=一样优化,有时像范围一样。

更具体地说,对于where gender = 'M' AND date_of_birth < '2000-01-01',基数无关紧要。

(gender, date_of_birth) -- will use both columns.
(date_of_birth, gender) -- will ignore `gender` and not be as efficient.

同样,请注意您提供的链接与您的情况不同,因为=<相同。

我在Cookbook中进一步讨论了这些问题。

以上是关于对于不同基数列的复合索引,订单是否重要?的主要内容,如果未能解决你的问题,请参考以下文章

如何将低/高基数列配对为复合索引?

T-SQL复合索引足以查询列的子集吗?

MySQL联合索引生效的条件、索引失效的条件

复合索引的优点和注意事项

复合索引的优点和注意事项

复合索引的优点和注意事项