对于使用复合 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 树索引。
最佳答案
没有。多列中的基数 INDEXes
不要紧。但是,列的使用确实很重要。
索引中的第一列需要使用 =
进行测试.在那之后,你会在一个“范围”处得到一个裂缝,比如 <
或 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 中进一步讨论了这些问题.
我在 Higher cardinality column first in an index when involving a range? 中进一步讨论了这个问题
关于mysql - 对于不同基数列的复合索引,顺序重要吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48985975/