order by、group by也会使用索引?使用这俩关键字的时候索引什么时间会失效

目录

写在前面

初始化语句

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的索引机制。