using filesort
用Explain分析SQL语句的时候,经常发现有的语句在Extra列会出现Using filesort,mysql官方文档对他的描述也很奇怪,不好理解
概念:mysql会对数据使用一种外部索引排序,而不是基于表内部索引顺序来进行读取,mysql无法利用内部索引来完成的排序被我们称为文件排序
注意:Using filesort 是Mysql里一种速度比较慢的外部排序,如果能避免是最好的了,很多时候,我们可以通过优化索引来尽量避免出现Using filesort,从而提高速度。
产生原因:
前提:涉及到order by语句且索引使用不当
情况一:原生的数据表,没有新建任何索引,除非是用主键作为排序字段,否则无论你怎么排序都会出现using filesort
情况二:在建立索引的情况下(只考虑符合索引,开发中很少见单值索引),标准情况如下
①最容易出错的情况就是不符合最佳左前缀匹配,如图
多列索引,形如 key ('A1','A2','A3' ,'A4')等的,排序的思路一般是,先按照A1来排序,A1相同,然后按照A2排序,
以此类推,这样对于(A1),(A1,A2),(A1,A2,A3)的索引都是有效的,但是对于(A2,A3)这样的索引就无效了
②符合最佳左前缀匹但是筛选字段不匹配索引字段,如图
using temporary
定义:mysql对数据进行排序时使用了临时表作为辅助工具,用于保存临时结果,来完成排序过程。
情景:涉及到group by且索引使用不当
后果:严重拖慢mysql的查询速度,意味着需要进行sql优化
解决方案:和using filesort情况基本一致,主要都是因为不符合最佳左前缀匹配法,通过创建或修改索引来优化,达到using index级别即可