最左前缀原则:顾名思义是最左优先,以最左边的为起点任何连续的索引都能匹配上。
(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查询优化器起的作用了;
今天的文章最左前缀和最左匹配_可交换矩阵满足的条件[通俗易懂]分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/77718.html