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

时间:2018-02-26 10:12:31

标签: mysql database database-design

对于使用复合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树索引。

1 个答案:

答案 0 :(得分:3)

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

索引中的第一列需要使用=进行测试。之后,您会在&#34;范围&#34;中获得一个破解,例如<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中进一步讨论了这些问题。