https://juejin.cn/post/7296665647617458210

写在前面

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

所以,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);

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

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

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

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

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

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

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