MySQL----索引使用规则


1 最左前缀法则

如果索引了多列(联合索引),要遵守最左前缀法则。

最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。

如果跳跃某一列,索引将会部分失效(后面的字段索引失效)。

show index from tb_user;

请添加图片描述
对于最左前缀法则指的是,查询时,最左边的列,也就是profession必须存在,否则索引全部失效。而且中间不能跳过某一列,否则该列后面的字段索引将失效。

接下来,我们来演示几组案例,看一下具体的执行计划:
按规则查询

explain select * from tb_user where profession = '软件工程' and age = 31 and status = '0';

请添加图片描述
字段索引

explain select * from tb_user where profession = '软件工程' and age = 31;

请添加图片描述


explain select * from tb_user where profession = '软件工程';

请添加图片描述
以上的这三组测试中,我们发现只要联合索引最左边的字段 profession存在,索引就会生效,只不过索引的长度不同。 而且由以上三组测试,我们也可以推测出profession字段索引长度为47、age字段索引长度为2、status字段索引长度为5。

explain select * from tb_user where age = 31 and status = '0';

请添加图片描述
字段索引长度为null,索引并未生效,原因是因为不满足最左前缀法则,联合索引最左边的列profession不存在

explain select * from tb_user where profession = '软件工程' and status = '0';

请添加图片描述
存在profession字段,最左边的列是存在的,索引满足最左前缀法则的基本条件。但是查询时,跳过了age这个列,所以后面的列索引是不会使用的,也就是索引部分生效,只有profession生效,所以索引的长度就是47。

3.1 字段顺序更换,最左前缀法则是否生效

 explain select * from tb_user where age = 31 and status = '0' and profession = '软件工程'

请添加图片描述
满足最左前缀法则的,索引长度54,联合索引是生效的。

最左前缀法则中指的最左边的列,是指在查询时,联合索引的最左边的字段(即是第一个字段)必须存在,与我们编写SQL时,条件编写的先后顺序无关。

2 范围查询

联合索引中,出现范围查询(>,<),范围查询右侧的列索引失效。

explain select * from tb_user where profession = '软件工程' and age > 30 and status = '0';

请添加图片描述

当范围查询使用> 或 < 时,走联合索引了,但是索引的长度为49,就说明范围查询右边的status字段是没有走索引的。

explain select * from tb_user where profession = '软件工程' and age >= 30 and status = 0';

请添加图片描述
当范围查询使用>= 或 <= 时,走联合索引了,但是索引的长度为54,就说明所有的字段都是走索引的。

因为存在等于,有了等于,查询到等于的记录,大于只要在等于的基础上继续查询就可以,相对于大于,有确定的记录。

猜你喜欢

转载自blog.csdn.net/m0_53022813/article/details/124373617