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

标签 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 树索引。

最佳答案

没有。多列中的基数 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/

相关文章:

mysql - 给定 MySQL 中的日期,如何确定一周的相对开始时间?

mysql - 添加 2 个文本框的值以在其中之一中显示结果

python - 返回数据库中的部门类(class)

mysql - 建模社交应用程序:我关注的用户订购“喜欢”

java - JBoss EAP 6.1+ 上的 JDBC 模块

javascript - 使用 php 将数据库中的值设置为 JavaScript

sql - 在 In 子句中传递时获取不在表中的记录?

数据库设计——系统默认项和自定义用户项

mysql - 相关项目 - 在记录之间建立双向关联

PHP编码问题