索引最左匹配原则

发布时间:2022-06-28 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了索引最左匹配原则脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

索引最左前缀匹配原则

介绍:在建立联合索引时,都遵循从左往右的优先级,最左优先,当出现范围查询(> < between like等等)时停止匹配。

首先需要了解索引常用的数据结构,B+树,网上资料众多,不再赘述

参考链接:https://blog.csdn.net/jiang_wang01/article/details/113739230

表准备

现在建一个很简单的表:

索引最左匹配原则

然后加入索引(基数都为5):

索引最左匹配原则

加入数据:

索引最左匹配原则

1-5都是按照数字顺序, 而6-10加入了重复数据

SQL语句执行

1.无范围查询

SELECT id,`name`,b_id,order_no,`age` 
FROM `t_test_suo`
WHERE b_id = 1 AND order_no = 1 AND `age` = 1

索引最左匹配原则

索引三个字段都走了

2.有范围查询

范围查询在中间

SELECT id,`name`,b_id,order_no,`age` 
FROM `t_test_suo`
WHERE b_id = 1 AND order_no <3 AND `age` = 1

索引最左匹配原则

这是最左前缀匹配原则就出现了,age也就是第三个字段没有走上索引,并且索引类型也变为了range(范围索引)

范围查询在第一位

SELECT id,`name`,b_id,order_no,`age` 
FROM `t_test_suo`
WHERE b_id < 4 AND order_no =3 AND `age` = 1

索引最左匹配原则

结果依旧是依据最左前缀匹配原则

为什么会有最左前缀匹配原则

大概描述一下在B+树结构下,最下面链表的顺序:

  (1,1,1), (2,2,2), (3,3,3) --> (4,4,4), (5,5,5), (6,6,6) --> (7,6,6), (8,7,7), (9,6,6) --> (9,8,8)

括号里面分别就是(b_id, order_no, age)

 

可以发现,b_id作为第一位,顺序始终都是正确的,而order_no作为第二位,在(8,7,7), (9,6,6)出现了顺序错误,因为b_id优先排列,所以order_no出错。

聪明的小伙伴其实应该联想到了order by的实现

索引最左匹配原则

order by中最前优先排列,如果相同,再看第二位,如果第二位相同,再看第三位。

 

所以可以思考得出:

一:范围查询在第一位

WHERE b_id < 4 AND order_no =3 AND age = 1,b_id就已经把第一个范围给找到了,不再需要order_no再走索引去找对应值了,而是在已经确定的范围中查找即可。

二:范围查询在中间

WHERE b_id = 1 AND order_no <3 AND age = 1,b_id走索引找到了=1的数据,然后order_no走索引查到了范围,那么age就在此范围中查询值即可。

 

欢迎各路大佬指正

脚本宝典总结

以上是脚本宝典为你收集整理的索引最左匹配原则全部内容,希望文章能够帮你解决索引最左匹配原则所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: