最左匹配原则中的范围查询问题

来源:3-9 索引额外问题之最左匹配原则的成因

小小de

2019-12-22

老师,
1、比如说,where a =1 and b =1 and c >1 and d =1,联合索引是(a,b,c,d)。其实用的是(a,b,c),那么遇到c>5时候是索引结束直接用到叶子结点的链路指针了吗?是因为c>1可能不可枚举,然后对导致索引过于大,所以d没有进行索引吗?

2、比如说,where a =1 or c =1 and b =1 ,联合索引是(a,b,c)。那这样的话b也不能提前吧,提前就变成where a =1 and b =1 or c =1 逻辑就不对了吧?

写回答

2回答

慕雪0079161

2019-12-22

  1. c这列还是用到了索引,d这列用不到索引,因为d的顺序是相对于c的,索引在c这里中断,所以d用不了联合索引。

  2. or关键字前后如果都具备索引,索引不会失效。联合索引是(a,b,c) ,a =1 or c =1 and b =1 不会用到索引

1
1
翔仔
赞同学的热心回答
2019-12-23
共1条回复

翔仔

2019-12-23

同学好,

1、mysql创建复合索引的规则是首先会对复合索引的最左边的,也就是第一个a字段的数据进行排序,在第一个字段的排序基础上,然后再对后面第二个的b字段进行排序,如果此时c是范围查询的话,则没法获取到有序的d,因此是不行的。具体可以看看这篇

https://www.zhihu.com/question/36996520/answer/93256153

2、这个是肯定的,mysql解析器调整顺序的前提是按照程序的幂等性,也就是保证取到的结果是一样的,即保证逻辑判断的有序性

0
0

剑指Java面试-Offer直通车 百度资深面试官授课

招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航

8427 学习 · 1870 问题

查看课程