最左匹配原则讲解可能存在一些误区,希望老师可以解释一下!!

来源: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),但并未明确说明,感谢同学指正。同学这点学习方式特别好,多钻研,多思考,多收获,也给我这边带来很大帮助,感谢,加油:)

3
3
慕容6015769
确实会产生误解,试了正准备问呢,现在不用了
2019-06-11
共3条回复

翔仔

2019-03-07

同学好,刚下班回来没带电脑,同学这个严谨的专研思路非常棒,我明天核对一下再给你答复,估计得晚上

1
0

qq_谁动了我的奶酪_03546962

提问者

2019-03-07

白天又查了很多资料,纠正一下,因为测试建的表只有a,b,c,d四个字段,那么建立(a,b,c,d)和(a,b,d,c)这样的索引也是没有什么意义的。所以我给表多加了一个e的字段。

表结构&联合索引

//img.mukewang.com/szimg/5c810e1300010fa009000614.jpg//img.mukewang.com/szimg/5c810e1a0001147c08650605.jpg

建立联合索引(a,b,c,d),测试结果key_len长度是15,用到了(a,b,c)联合索引

-------------------------------------------------------------------------------------------


//img.mukewang.com/szimg/5c810e230001dece08930462.jpg//img.mukewang.com/szimg/5c810e2d0001cd2308990513.jpg


建立(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




0
0

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

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

8441 学习 · 1872 问题

查看课程