当前位置 博文首页 > A_art_xiang的博客:order by、group by也会使用索引?使用这俩

    A_art_xiang的博客:order by、group by也会使用索引?使用这俩

    作者:[db:作者] 时间:2021-07-14 09:58

    目录

    写在前面

    初始化语句

    order?by索引分析

    总结

    group?by


    写在前面

    ? ? 我们都知道,索引可以提高查询和排序的速度。

    ? ? 所以,order?by做排序的时候,显然是可以使用索引的。

    ? ? group?by做分组也会用到索引吗?

    关于查询时索引失效场景的验证,请参考这篇文章:MySQL索引失效的场景,什么情况下会造成MySQL索引失效

    初始化语句

    CREATE TABLE `student`  (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(20),
      `age` int(11),
      `address` varchar(25),
      `crtdate` timestamp,
      PRIMARY KEY (`id`) USING BTREE
    );
     
    insert into student(name,age,address,crtdate) values('张三', 15, '山东青岛', now());
    insert into student(name,age,address,crtdate) values('李四', 17, '山东济南', now());
    insert into student(name,age,address,crtdate) values('王五', 18, '山东潍坊', now());
     
    -- 创建复合索引
    alter table student add index idx_stu_nameAgeAddr(name,age,address);

    order?by索引分析

    MySQL支持两种方式排序,fileSort和index,index效率高,fileSort效率低

    order?排序同样也适用于查询的那些索引规则

    name用于查询,age用于查询和排序,遵循最左前缀原则,所以查询和排序都用到了索引:

    age是范围查询,所以address失效了,排序就使用filesort方式:

    只用到了age,复合索引开头的name没使用,所以age失效,排序没走索引:

    查询用到age,排序用到address,没用到索引开头的name,所以查询和排序都失效:

    正常走索引,但是如果有升序有降序,就会导致索引失效:

    总结

    假设建立索引key a_b_c(a,b,c)

    order by 能使用最左前缀原则(以下四种情况索引生效):
    - order by a
    - order by a,b
    - order by a,b,c
    - order by a desc,b desc,c desc

    如果where+order by符合最左前缀原则,则索引生效
    - where a=1 order by b,c
    - where a=1 and b=2 order by c
    - where a=1 and b>2 order b,c

    以下情况索引失效:
    - order by a asc,b desc,c desc // 排序不一致
    - where d=1 order by b,c //丢失a索引
    - where a=1 order c // 丢失b索引
    - where a>1 order b,c // 范围之后失效

    group?by

    group?by实际是先进行排序,再进行分组。所以遵循order?by的索引机制。

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    cs