对于不同基数列的复合索引,顺序重要吗?

nwa*_*arp 1 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);

类似的问题是如何将低/高基数列配对为复合索引?但接受的答案没有解释建议背后的原因。

我问的是 MySQL,但我猜测答案适用于任何 B 树索引。

Ric*_*mes 6

不。多列中的基数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.
Run Code Online (Sandbox Code Playgroud)

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

我在我的食谱中进一步讨论了这些问题。

在涉及范围时首先在索引中的更高基数列中进一步讨论了这一点?