最左匹配原则讲解可能存在一些误区,希望老师可以解释一下!!
来源:3-9 索引额外问题之最左匹配原则的成因

qq_谁动了我的奶酪_03546962
2019-03-07
上网查了很多博客和文章,才提出了这个问题,有图有真相。
当where条件是a =3 and b =d and c>5 and d =6的时候,如果建立(a,b,c,d)顺序的索引,d是用不到索引的,但是确可以使用到(a,b,c)这个索引!!为什么呢?没有建立(a,b,c)这样的联合索引,明明建的是(a,b,c,d)这个联合索引。其实当建立(a,b,c,d)这个联合索引的时候,实际上也就相当于建立了(a),(a,b),(a,b,c)。
实践是检验真理的唯一方式:
只建立(a,b,c,d)顺序的联合索引
表结构如下:
这回修改下顺序,建立(a,b,d,c)顺序的联合索引
总结:
通过上面修改联合索引c和d的顺序,执行explain发现,where a =1 and b =2 and c >5 and d =3 ,如果建立联合索引的顺序是(a,b,c,d),那么d不会走索引,mysql执行这条sql时,还是会走索引,只不过走的是(a,b,c)联合索引,key_len的长度是10.
如果建立联合索引的顺序是(a,b,d,c),此时的key_len的长度是15,意味走了全部的索引,也就是d用上了索引
3回答
-
翔仔
2019-03-08
同学好,我仔细看了下视频,视频里面的思路是正确的,就是有一个地方讲得比较模糊,就是联合索引这块,比如说,where a =1 and b =2 and c >5 and d =3,联合索引是(a,b,c,d)。视频里说的不走联合索引指的是实际上不走(a,b,c,d) 但是会走(a,b,c) 原因是(a,b,c,d)索引创建的时候,会创建 (a)(a,b)(a,b,c)(a,b,c,d)这样子的搜索结构,所以最多能走到(a,b,c)但是没走到(a,b,c,d),这个可以直接从长度看出来,咱们的title和area的试验中的key_length看出来,所以视频里的联合指代的是(a,b,c,d),但并未明确说明,感谢同学指正。同学这点学习方式特别好,多钻研,多思考,多收获,也给我这边带来很大帮助,感谢,加油:)
332019-06-11 -
翔仔
2019-03-07
同学好,刚下班回来没带电脑,同学这个严谨的专研思路非常棒,我明天核对一下再给你答复,估计得晚上
10 -
qq_谁动了我的奶酪_03546962
提问者
2019-03-07
白天又查了很多资料,纠正一下,因为测试建的表只有a,b,c,d四个字段,那么建立(a,b,c,d)和(a,b,d,c)这样的索引也是没有什么意义的。所以我给表多加了一个e的字段。
表结构&联合索引
建立联合索引(a,b,c,d),测试结果key_len长度是15,用到了(a,b,c)联合索引
-------------------------------------------------------------------------------------------
建立(a,b,d,c)联合索引,测试sql,key_len长度是20,索引全部用上了。
--------------------------------------------------------------------------------------
跟上面问题贴的图片唯一的变化在于key_len不同,昨天也想了很久,用到(a,b,c)三个字段的索引长度为什么是10,直到今天又查了一些资料,看到有些人说表总共四个字段,建立(a,b,c,d)这样的全部字段联合索引没有实际意义。可能跟这个有关系,所以给表增加个e字段测试了一下。发现这次用到(a,b,c)三个字段的时候,索引长度是15,用到(a,b,d,c)四个字段的时候索引长度是20。一个字段长度是5
00
相似问题