MySQL 中的多列索引如何工作?

Posted

技术标签:

【中文标题】MySQL 中的多列索引如何工作?【英文标题】:How does a multi-column index work in MySQL? 【发布时间】:2022-01-02 20:52:21 【问题描述】:

更具体地说,mysql 使用什么数据结构进行多列索引? 我知道 MYSQL 使用 Btree 进行索引,它只能索引一列。那么多列索引是如何工作的呢?

【问题讨论】:

Google 发现:(在前 10 个结果中)All About Indexes Part 2: MySQL Index Structure and Performance 我知道MYSQL使用Btree进行索引,只能索引一列。你的知识不正确。 BTree 只能索引一个表达式。而这个单一的表达式可能包括列、文字、运算符、确定性函数的复杂组合……唯一的要求是这个复杂的表达式必须给出标量值。 @Akina - 嗯,这也是“错误的”。看我的回答。 【参考方案1】:

以这种方式考虑 MySQL“复合”索引。

将索引中的所有列连接在一起,然后在该“单个”字符串上构建 BTree 索引。

一些相关的cmets:

一旦您理解了这个类比,您就会明白为什么各个列的基数无关紧要。也就是说,复合索引中列的顺序与性能无关。顺序确实很重要,具体取决于查询要求的内容。

INDEX(a,b) 可能对这些有用:

 WHERE a = 123
 WHERE b = 5 AND a = 678

但不能用于

 WHERE b = 5

(注意我使用“连接”。由于连接浮点数、日期、有符号整数、具有奇数排序规则的字符串等并不实际,就好像它们只是字节一样,我并不是说 InnoDB 从字面上连接字节在一起。)

【讨论】:

以上是关于MySQL 中的多列索引如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中多列索引的字段顺序是不是重要

Mysql Innodb 性能 - 如何最小化多列索引?

IN子句中的MySQL多列

MySQL处理重复键错误插入具有多个唯一索引的表;不是多列唯一索引

Mysql多列索引使用错误的索引

如何在工作表中动态创建具有列数的数组,以删除多列中的重复项