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,所以查询和排序都失效:
正常走索引,但是如果有升序有降序,就会导致索引失效: