开发者社区> 问答> 正文

什么是最左前缀原则?什么是最左匹配原则?

什么是最左前缀原则?什么是最左匹配原则?

展开
收起
请回答1024 2020-03-31 10:50:25 12634 0
2 条回答
写回答
取消 提交回答
  • Java程序员

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

    (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、三个字段联合索引测试: image.png

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

    SELECT * FROM user where sex="3"; #使用索引
    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使用到了索引的,

    image.png

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

    image.png

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

    explain SELECT * FROM index_demo.user where sex="3"; #使用索引
    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";  #使用索引
    

    image.png image.png

    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"; #使用索引

    这条语句竟然使用索引了

    image.png

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

    ————————————————

    版权声明:本文为CSDN博主「徐刘根」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/u010870518/java/article/details/79572598

    2020-03-31 13:16:41
    赞同 展开评论 打赏
  • 顾名思义,就是最左优先,在创建多列索引时,要根据业务需求,where子句中使用最频繁1. 的一列放在最左边。

    1. 最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

    2. =和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式

    2020-03-31 10:50:47
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载