• 谈谈联合索引


    今日面试官问我,假设存在(a,b,c)三个字段的联合索引,问我
     1、如果where a=x and b=x,是否会用到索引?
     2、如果 where a=x and b=x order by c desc 会不会用到索引?
     3、如果 where a=x and b=x group by c  会不会用到索引?

    我当时的回答是

    1 否,因为没有用到c
    2是,因为order by会用到索引

    3 否,因为group by是在where之后,不走索引

    那么我现在来检查一下我的答案。查阅了一下资料,其实建立(a,b,c)三个字段的联合索引,就是相当于建立了(a,b,c)、(a,b),a的三个索引(最佳左前缀特性),而order by是能使用最左前缀索引的,所以其实

    • where a=x and b=x ;  会用到索引(a,b)
    • where a=x and b=x order by c desc;   会用到索引(a,b,c)
    • where a=x order by b desc,c desc;    会用到索引(a,b,c)
    • order by a asc,b desc,c desc;         不会用到索引,因为排序不一致
    • order by a;
    • where a=x order by c ;           order by没有命中索引但是where有命中索引
    • where a=x order by b,d;         where命中索引但是order by没有命中
    • where a in (x,y,m) order by b,c ;  where命中索引但是orderby没有命中,因为where使用索引的最左前缀不为常量

    那么上面的1、2应该是都有用到索引的,那么3呢,group by真的没有用到索引吗?查了一下资料,得到的结论是group by和order by索引用法是一样的。所以3应该也是肯定的答案。

    但是有两份资料说法有矛盾,一个说联合索引没有where的铺垫order by是不走索引的,另一个说只要遵循最左原则order by是可以走索引的。我这边验证过了,当没有where的铺垫的时候,order by 是不走索引的。

    还有联合索引的顺序也要一致才能使用索引的,就是说,where a=x order by c,b这个语句,cb不用索引,但是a有用到索引。那么where a=x and c=x and b=x会不会使用索引呢?验证过后看到是有用a索引的。

    以上是我今日的一些总结,
    参考
    https://blog.csdn.net/qq_39338079/article/details/97381667 
    https://blog.csdn.net/q6627666/article/details/89607932
    https://www.jianshu.com/p/f65be52d5e2b

  • 相关阅读:
    struct--file_operations
    接触到的一些数据结构: LIST_ENTRY, TAILQ
    Kernel Mode, User Mode
    可运行的代码
    写一篇Hook Driver.
    Chromium学习笔记
    Resources for Browser/Webkit/GPU
    Win7/8, convert dynamic disk volume to basic volume.
    System and Device power management.
    错误记录1----dom4j解析xml调试编码错误
  • 原文地址:https://www.cnblogs.com/smallzhen/p/12702491.html
Copyright © 2020-2023  润新知