最左前缀原则:顾名思义是最左优先,以最左边的为起点任何连续的索引都能匹配上。

(1)如果第一个字段是范围查询需要单独建一个索引;

(2)在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边;

当创建(a,b,c)复合索引时,想要索引生效的话,只能使用 a和ab、ac和abc三种组合!

实例:以下是常见的几个查询:

mysql>SELECT `a`,`b`,`c` FROM A WHERE `a`='a1' ; //索引生效
mysql>SELECT `a`,`b`,`c` FROM A WHERE `b`='b2' AND `c`='c2'; //索引失效
mysql>SELECT `a`,`b`,`c` FROM A WHERE `a`='a3' AND `c`='c3'; //索引生效,实际上值使用了索引a

扩展:想要索引最大化的使用需要至少建几个索引?

答:需要建立复合索引:bc

3.1、三个字段联合索引测试:

在这里插入图片描述

联合索引的顺序为:sex,age,name

SELECT * FROM user where age="4"; #未使用索引
SELECT * FROM user where name="2"; #未使用索引
SELECT * FROM user where sex="2" and age="3"; #使用索引
SELECT * FROM user where sex="2" and age="3" and name="4"; #使用索引
SELECT * FROM user where age="3" and name="4";  #未使用索引
SELECT * FROM user where sex="2" and name="4";  #使用索引

#这个在3.2最后边解释,为什么

explain SELECT * FROM index_demo.user where age="2" and sex="3"; #使用索引

值得注意的是,where sex=“2” and name=“4” 这个相当于只有sex使用到了索引的,

在这里插入图片描述

和where sex=“2” and age=“3” and name="4"的区别:

在这里插入图片描述

3.2、如果索引字段有两个 如果索引有两个字段:sex,age

在这里插入图片描述

explain SELECT * FROM index_demo.user where age="4"; #未使用索引
explain SELECT * FROM index_demo.user where sex="2" and age="3"; #使用索引
explain SELECT * FROM index_demo.user where age="3" and sex="4";  #使用索引

在这里插入图片描述
在这里插入图片描述
where sex=“2” and age=“3”;和where sex=“2” and age=“3”;

这两个都是用了索引的,这是mysql查询优化器,mysql查询优化器会判断纠正这条sql语句该以什么样的顺序执行效率最高,最后才生成真正的执行计划。所以,当然是我们能尽量的利用到索引时的查询顺序效率最高咯,所以mysql查询优化器会最终以这种顺序进行查询执行。

然后回到刚才的3.1中三个索引的时候:sex,age,name

explain SELECT * FROM index_demo.user where age="2" and sex="3"; #使用索引

这条语句竟然使用索引了

在这里插入图片描述

可以看出他是使用索引了,因为对于三个索引的时候,只要是前两个,存在,不论顺序是什么都是会使用索引的,这里主要是mysql查询优化器起的作用了;

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐