李优秀 发表于 2025-2-15 01:48:09

MySQL 团结索引的最左匹配原则

环境:MySQL 版本:8.0.27
执行筹划基础知识

possible_keys:大概用到的索引
key:实际用到的索引
type:

[*]ref:当通过普通的二级索引列与常量进行等值匹配的方式 询某个表时
[*]const:当我们根据主键或者唯一得二级索引列与常数进行等值匹配时,对单表的访问方法就是 const
[*]range:如果使用索引获取某些单点扫描区间的记录。
[*]index:当可以使用覆盖 ,但需要扫描全部的索引记录时。
Extra:

[*]Using index 索引覆盖
[*]Using Where 当某个搜索条件需要在 server 层进行判断时
[*]Using index for skip scan 跳跃扫描
[*]Using index condtion 索引下推
最左匹配原则

最左优先,以最左边的为出发点任何一连的索引都能匹配上。同时碰到范围查询(>、<、between、like)就会制止匹配。
比如有团结索引 ,where 过滤条件中哪些排列组合可以用到索引?(比如这种:where a=xxx b=xxx and c=xxx)
以下排列组合都会走索引: a、ab、ac、ba、ca、abc、acb、bac、bca、cab、cba。 必须有一个 a,排列组合中的顺序会被优化器优化,以是不用关心顺序。
以下排列组合不会走索引: b、c、bc、cb。 因为没有 a。
关于范围查询: a=xxx and b<10 and b > 5 and c =xxx,c 字段用不到索引,因为 b 是一个范围查询,碰到范围查询就制止了。
最左匹配原则的原理: 我们都知道索引的底层是一颗 B+ 树,那么团结索引当然还是一颗 B+ 树,只不过团结索引的健值数量不是一个,而是多个。构建一颗B+树只能根据一个值来构建,因此数据库依据团结索引最左的字段来构建B+树。 例子:假如创建一个(a,b)的团结索引,那么它的索引树是这样的,如下图所示:
https://i-blog.csdnimg.cn/direct/03c38bb6d39a4bac8ce0c666d10caa34.png
可以看到 a 的值是有顺序的,1,1,2,2,3,3,3,3。b 的值是没有顺序的1,2,2,5,1,2,3,5。
以是 b = 2 这种查询条件没有办法利用索引,因为团结索引首先是按a排序的,b是无序的。
同时我们还可以发现在a值相等的情况下,b值又是按顺序排列的,但是这种顺序是相对的。以是最左匹配原则遇上范围查询就会制止,剩下的字段都无法使用索引。例如 a=1 and b=2 a,b 字段都可以使用索引,因为在 a 值确定的情况下 b 是相对有序的,而 a>1 and b=2,a 字段可以匹配上索引,但 b 值不可以,因为a的值是一个范围,在这个范围中b是无序的。



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: MySQL 团结索引的最左匹配原则