对于使用复合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树索引。
答案 0 :(得分:3)
没有。多列INDEXes
中的基数无关紧要。但是,列的使用很重要。
索引中的第一列需要使用=
进行测试。之后,您会在&#34;范围&#34;中获得一个破解,例如<
或BETWEEN
。 IN
位于灰色区域,有时会优化为=
,有时像范围一样。
更具体地说,对于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中进一步讨论了这些问题。