最左匹配原则即最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配。
为什么会形成最左匹配原则?
最左匹配原则是针对联合索引来说,索引的底层是一颗B+树,联合索引的键值是多个,构建一颗B+树只能根据一个值来构建,因此依据联合索引最左的字段来构建B+树。假如创建一个(a,b)的联合索引,a的值是有顺序的,在a值相等的情况下,b值按顺序排列的,但是这种顺序是相对的。所以最左匹配原则遇上范围查询就会停止,剩下的字段都无法使用索引。
在这里,直接说结论,方便面试回答,具体的解析可以下去自己搜,如果有问题欢迎评论讨论
针对联合索引(a,b,c)
- where a=? and b=? and c=?
- where a=? and c=? and b=?
- where c=? and b=? and c=?
都会走(a,b,c)的联合索引,等值下乱序不影响
- where a=? and b>? and c=?
- where a>? and c=? and b=?
- where a=? and b=? and c>?
遇到范围查询会中断,答案分别是(a,b) (a) (a,b,c)
- where a=? and c=?
只会走a的索引
- order by a,b
当没有where的铺垫的时候,order by 是不走索引的。
- where a=? order by c,b;
走a索引
- where a=? and b=? order by c
会走(a,b,c)的联合索引,当a = ?and b=? 的时候,c相对有序,可以避免再次排序!
- where a=? and b=? and c>? order by c
会走(a,b,c)的联合索引,
- where a in(1,2,3) and b=? and c=?
类似于 a=1 or b=2 or c=3,范围查找,中断索引,只会走a的索引。当in中的对象与a不是一个类型时,会进行类型转换,更不会走索引。
- where a between 3 and 9 and b=? and c=?
在于between-and的范围,范围小会走索引,范围过大,优化器会优化为全表查询 开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 19 天,点击查看活动详情
参考
www.cnblogs.com/rjzheng/p/1…
order by:www.cnblogs.com/smallzhen/p…