mysql 执行计划是什么_面试官:MySQL执行计划Using filesort能解释下 程序员:这是什么...

MySQL、数据库、MySQL性能优化、程序员、DBA

MySQL版本

mysql版本不同,有些特性是有区别的,请小白注意

a3318c941136e31422f9e0be7c9e8802.gif

面试官:MySQL执行计划Using filesort能解释下 程序员:这是什么-1.jpg (7.16 KB, 下载次数: 0)

2020-11-20 18:56 上传

数据准备

一张员工工资表,字段很简单

a3318c941136e31422f9e0be7c9e8802.gif

面试官:MySQL执行计划Using filesort能解释下 程序员:这是什么-2.jpg (48.87 KB, 下载次数: 0)

2020-11-20 18:56 上传

Using filesort

using filesort一般出现在 order by 这样的SQL执行计划 using filesort出现了,不一定会导致MySQL性能问题,出现大量数据需要using filesort会导致性能瓶颈

MySQL排序分2类

有索引(扫描索引生成有序结果) 无索引(内存中排序)

有索引情况

order by 字段(有索引)本来就是有序的,所以无需另外排序

例子根据ID主键排序,执行计划无Using filesort

但现实开发中,你字段有索引有时也会出现Using filesort

a3318c941136e31422f9e0be7c9e8802.gif

面试官:MySQL执行计划Using filesort能解释下 程序员:这是什么-3.jpg (30.2 KB, 下载次数: 0)

2020-11-20 18:56 上传

有索引也分3种场景

索引只出现where 索引只出现order by 索引出现在where和order by

场景1:索引只出现where

where后的dept有索引,但name无索引

a3318c941136e31422f9e0be7c9e8802.gif

面试官:MySQL执行计划Using filesort能解释下 程序员:这是什么-4.jpg (38.62 KB, 下载次数: 0)

2020-11-20 18:56 上传

执行过程

1:先通过索引字段dept匹配出满足where条件的主键ID(B+树节点找叶子节点,时间复杂度0(logN))

2:然后通过这些主键ID找到这几行数据(时间复杂度0(M*logN),M临时表rows)

3:对这些数据进行filesort排序工作(时间复杂度0(M*logM),M临时表的rows)

本例子中where匹配数据非常少,所以整个执行过程消耗几乎0秒,

当你的生产代码where匹配出非常多数据时,filesort执行就会非常耗时了

场景2 索引只在order by

索引只出现在order by ,也就是索引扫描排序了

我通过FORCE INDEX强制执行索引index_dept

这里我不强制,MySQL可能会filesort,因为当数据量非常少情况时,filesort更加快些。

a3318c941136e31422f9e0be7c9e8802.gif

面试官:MySQL执行计划Using filesort能解释下 程序员:这是什么-5.jpg (32.99 KB, 下载次数: 0)

2020-11-20 18:56 上传

这里当数据量够大是,执行时间会非常耗时。

整个时间复杂度是0(M*logN ),M主键id总数量,N索引叶子节点个数

场景3索引同时在where和order by

这是最佳场景,你的业务SQL最好是这样设计,这样省去了回查表操作

a3318c941136e31422f9e0be7c9e8802.gif

面试官:MySQL执行计划Using filesort能解释下 程序员:这是什么-6.jpg (27.97 KB, 下载次数: 0)

2020-11-20 18:56 上传

无索引情况

order by 字段(无索引),所以需要对结果进行排序操作

执行计划会出现Using filesort

例子根据姓名排序,此字段无索引

a3318c941136e31422f9e0be7c9e8802.gif

面试官:MySQL执行计划Using filesort能解释下 程序员:这是什么-7.jpg (29.55 KB, 下载次数: 0)

2020-11-20 18:56 上传

优化思路

老套路,合理的去创建索引 Using filesort是通过相应的排序算法,将取得的数据在内存中进行排序。 避免多余的排序,很多业务无需排序可以直接order by Nulll来禁止排序 请看场景3,就是最佳方案

以上皆为个人理解,如果有理解错的地方,欢迎专家指出

a3318c941136e31422f9e0be7c9e8802.gif

面试官:MySQL执行计划Using filesort能解释下 程序员:这是什么-8.jpg (38.42 KB, 下载次数: 0)

2020-11-20 18:56 上传

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值