为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL执行计划出现 Using filesort 是什么原因?如何进行优化?

标签:
MySQL 大数据

在对以一个 SQL 的执行计划进行分析时,我们会关注 Extra 这个属性,当这个属性的值是 Using filesort 时,就需要看下 SQL 是否需要优化一下了。

SELECT * FROM t1 JOIN t2 ON t1.c1=t2.c1 order by t2.c2;

MySQL 会选择结果集较小的表作为驱动表,比如上面的 SQL,两张表使用 c1 这个字段进行 JOIN,如果选择了 t1 做为驱动表,但是使用 t2 的字段 c2 进行排序,那排序操作就会走不上索引。

2.3 UNION 语句

EXPLAIN SELECT id,a,b FROM test4 UNION SELECT * FROM test5 ORDER BY a;

在 union 语句中,如果对结果集进行排序,也有可能会走 filesort。

2.4 GROUP BY

SELECT age,COUNT(age) ca FROM db_staff GROUP BY age;

上面是一个分组的 SQL,在 MySQL 8.0 以前,GROUP BY 默认是会对分组字段做排序的,即使 sql 中没写 ORDER BY,也会排序。如果分组字段未加索引,很容易走 filesort。

如果想要 sql 语句不排序,可以在 sql 尾部加 order by null。

2.5 DISTINCT 语句

EXPLAIN SELECT DISTINCT b FROM test5 ORDER BY b;

如果在 DISTINCT 语句中使用ORDER BY,可能会走filesort

2.6 临时表

当查询需要创建临时表,比如上面的UNIONDISTINCTGROUP BY,如果临时表结果集需要排序,则可能使用filesort

3.优化思路

3.1 索引优化

如果 ORDER BY 字段没能走索引,可以考虑进行优化:

  • ORDER BY 只有一个字段,则为该字段增加索引;

  • ORDER BY 有多个字段,可以考虑复合索引。比如下面的示例:

CREATE INDEX idx_a_b ON orders(a, b);

EXPLAIN SELECT * FROM test4 WHERE a = 'testa' ORDER BY b;
  • 排除可能使索引失效的情况,比如函数或表达式、ORDER BY 和索引顺序不一致;

  • 没有必要排序的场景,可以不排序,比如使用 ORDER BY NULL 语句。

JOIN 优化

确保 ORDER BY 子句的字段是驱动表上的索引字段,并且符合最左前缀原则,必要时可以强制使用索引 FORCE INDEX。

配置优化

增大 sort_buffer_size 配置,避免走磁盘排序。不过一定要注意,sort buffer 是会话私有的,高并发场景下,可能导致数据库内存升高。

4.总结

当执行计划的 Extra 属性出现 Using filesort 时,大概率我们的 SQL 需要优化了。可能查看 SQL 属于那种情况,针对性地进行优化。https://mybj123.com/27639.html


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
Web前端工程师
手记
粉丝
5
获赞与收藏
8

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消