在 MySQL 执行计划中 Using filesort 指的是什么意思?

学习笔记 马富天 2020-06-05 11:11:39 57 0

【摘要】当我们在使用 MySQL 的 explain 命令来查看 sql 执行信息的时候,常常会看到 Using filesort,那么什么情况下会导致 Using filesort 的出现,本文就通过简单例子来讲解一下 Using filesort 的意思。

其实 Using filesort 指的是在 sql 排序操作中没有通过索引来完成排序,那么这次排序操作就使用到了 filesort,这里的 filesort 它的实现是我们所熟知的快速排序。这一问题会影响到 sql 查询的速度,它的出现通常与 order by 或者 group by 有直接关系,我们需要通过建立合适的索引或者使用合适的索引字段来进行排序操作。

大家都知道对于 B+Tree 索引类型本质是一棵排好需要的平衡多路搜索树,如果仅仅是在索引字段上进行排序的话,实际上是已经排好序了,无需再次进行排序。

  1. -- 一张演示表,无需插入数据
  2. create table test(
  3.     id int auto_increment primary key,
  4.     name varchar(255),
  5.     stu_id int,
  6.     class_no varchar(10),
  7.     index idx_stu_id(stu_id),
  8.     index idx_class_no(class_no)
  9. );
  10. -- 会出现 Using filesort,因为 name 字段是没有走索引的,需要使用快排进行排序
  11. explain select name from test order by name desc;
  12. -- 会出现 Using filesort,虽然 stu_id 字段是有索引的,
  13. -- 但是 select 中没有覆盖索引,需要回表操作,等找到所需完整数据再次对 stu_id 字段进行排序
  14. explain select id,name,stu_id from test order by stu_id desc;
  15. -- 不会出现 Using filesort,因为聚簇索引 id 本身已经排好序号,需要再次进行排序
  16. explain select * from test order by id desc;
  17. -- 不会出现 Using filesort,因为 B+Tree 的叶子节点存放了聚簇索引的值和该索引字段存放的值
  18. explain select id,stu_id from test order by stu_id desc;

当然这里没有演示联合索引的情况,需要大家自己手动去试,联合索引需要遵守最左前缀原则,若未遵守,则在排序时也会出现 Using filesort,大家去尝试哦~

版权归 马富天PHP博客 所有

本文标题:《在 MySQL 执行计划中 Using filesort 指的是什么意思?》

本文链接地址:http://www.numberer.net/446.html

转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^

2

0

上一篇《 MySQL 事务的四种隔离级别简介 》 下一篇《 MySQL 中的联合索引介绍【最左前缀匹配原则】 》

暂无评论

评论审核未开启
表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情 表情
验证码

TOP10

  • 浏览最多
  • 评论最多