order by和group by这两个要十分注意,因为一不小心就会产生文件内排序,即file sort,这个性能是十分差的。下面来看具体的案例分析。
首先建表:
create table `tblA`(
`id` int not null primary key auto_increment comment '主键',
`age` int not null comment '年龄',
`birth` timestamp not null comment '生日'
) ;
insert into tblA(age, birth) values(22, now());
insert into tblA(age, birth) values(23, now());
insert into tblA(age, birth) values(24, now());
create index idx_age_birth on tblA(age, birth);复制
1. order by:
看看下面语句的执行计划:
explain select * from tblA where age > 20 order by age;
explain select * from tblA where age > 20 order by age,birth;复制
这两个个毫无疑问,可以用到索引。

再来看看这个:
explain select * from tblA where age > 20 order by birth;
复制

显然我们可以看到这里产生了filesort,为什么呢?因为age是范围,且order by的直接是二楼,带头大哥没了,所以索引失效了。
那这样呢?
explain select * from tblA where age > 20 order by birth, age;
explain select * from tblA where age > 20 order by age, birth;复制

第一个还是不行,因为范围后失效,且order by是从birth二楼开始的。第二个可以用到索引,不会产生filesort,是因为,虽然前面的age是范围,但是order by的又是从age开始,带头大哥在。
上面这些都好理解,看看这个:
explain select * from tblA order by age desc, birth asc;
复制

奇了怪了,带头大哥在,也没有范围,为啥就出现了filesort了呢?
这是因为age是降序,birth又是升序,一升一降,就会导致索引用不上,就会产生filesort了。如果把两个都改成desc或者asc,那就没问题了。
注意:
MySQL的filesort有两种策略,
MySQL4.1之前,叫双路排序。
就是会进行两次磁盘I/O操作。读取行指针和order by的列,
对它们排序,然后扫描排好序的表,再从磁盘中取出数据来。
4.1之后的版本,叫单路排序,只进行一次I/O。
先将数据从磁盘读到内存中,然后在内存中排序。
但是,如果内存,即sort_buffer_size不够大,性能反而不如双路排序。复制
order by优化小总结:
尽量避免 select *
;尝试增大 sort_buffer_size
,不管用哪种算法,增大这个都可以提高效率;尝试增大 max_length_for_sort_data
,增大这个,会增加用改进算法的概率。
2. group by:
group by 其实和order by一样,也是先排序,不过多了一个分组,也遵从最佳左前缀原则。要注意的一点是,where优于having,能用where时就不要用having。
扫描二维码
获取更多精彩
java开发那些事

文章转载自java开发那些事,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【MySQL 30周年庆】MySQL 8.0 OCP考试限时免费!教你免费领考券
墨天轮小教习
3142次阅读
2025-04-25 18:53:11
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
严少安
876次阅读
2025-04-25 15:30:58
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
521次阅读
2025-04-17 17:02:24
MySQL 9.3 正式 GA,我却大失所望,新特性亮点与隐忧并存?
JiekeXu
448次阅读
2025-04-15 23:49:58
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
381次阅读
2025-04-15 14:48:05
MySQL 8.0 OCP 1Z0-908 考试解析指南(二)
JiekeXu
328次阅读
2025-04-30 17:37:37
记录MySQL数据库的一些奇怪的迁移需求!
陈举超
294次阅读
2025-04-15 15:27:53
SQL优化 - explain查看SQL执行计划(下)
金同学
291次阅读
2025-05-06 14:40:00
MySQL 8.0 OCP 1Z0-908 考试题解析指南
青年数据库学习互助会
280次阅读
2025-04-30 12:17:54
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
数据库运维之道
277次阅读
2025-04-28 11:01:25