您的位置:首页 > 数据库 > MySQL

MySQL explain 的Using temporary; Using filesort

2016-08-25 12:00 260 查看
在使用explain优化sql的时候,有Using temporary; Using filesort这两种是需要特别注意的:

Using temporary:在MySQL执行查询的过程中自动产生临时表(Creating tmp table)

Using filesort:是指查询完成之前还需要“额外的一次排序”



MYSQL手册是这么解释的“MySQL需要额外的一次传递,以找出如何按排序顺序检索行。通过根据联接类型浏览所有行并为所有匹配WHERE子句的行保存排序关键字和行的指针来完成排序。然后关键字被排序,并按排序顺序检索行。”

下面用例子解释一下:

例子:yearAndQuarter 保存了id(uuid),year,quarter三个字段,year和quarter是正常的一些数据。

1、SELECT s.year, s.quarter FROM yearAndQuarter s WHERE s.year = '2016'

<span style="font-size: 14px; line-height: 26px;"><span style="color:#333333;">2、SELECT s.year, s.quarter FROM yearAndQuarter s WHERE s.year = '2016' </span><strong><span style="color:#ff0000;">ORDER BY s.year , s.quarter</span></strong><span style="color:#333333;"> </span></span>

原因:产出Using filesort是在加了ORDER
BY 之后,可以解释成第一句是按主键id排序的,第二句在主键id排序后,还有一次根据s.year , s.quarter的排序。

消除:添加s.year , s.quarter的索引而不是单个的索引,这样查询时order by默认是按照索引的顺序,不需要额外的进行排序。

<span style="font-family:Arial;"><span style="font-size: 14px; line-height: 26px;"><span style="color: rgb(51, 51, 51);">3、SELECT s.year, s.quarter FROM yearAndQuarter s WHERE s.year = '2016' </span><strong><span style="color: rgb(255, 0, 0);">ORDER BY s.year , s.quarter</span></strong><span style="color: rgb(51, 51, 51);"> </span></span></span>


<span style="font-family: Arial;"><span style="font-size: 14px; line-height: 26px;"></span></span><pre name="code" class="sql"><span style="font-family: Arial;"><span style="font-size: 14px; line-height: 26px;"><span style="color:#333333;">4、SELECT s.year, s.quarter FROM yearAndQuarter s WHERE s.year = '2016' </span><strong><span style="color:#ff0000;">GROUP BY s.year,s.quarter</span></strong><span style="color: rgb(51, 51, 51);">
</span></span></span>



这里加了group by,出现了Using temporary; Using filesort,在执行过程中会使用临时表,并且没有使用索引排序,如果使用了索引就不会有这两个出现。

这两个还有很多出现的情形,上面列举的只是比较常见的一个情形。

上面的内容是学习过程中出现的问题的收集整理,加上自己理解测试,做一次记录,不排除有些理解错误的地方,以便后续有需要使用。

1、SELECT s.year, s.quarter FROM yearAndQuarter s WHERE s.year = '2016'

<span style="font-family: Arial;"><span style="font-size: 14px; line-height: 26px;"><span style="color: rgb(51, 51, 51);">3、SELECT s.year, s.quarter FROM yearAndQuarter s WHERE s.year = '2016' </span><strong><span style="color: rgb(255, 0, 0);">ORDER BY s.year , s.quarter</span></strong><span style="color: rgb(51, 51, 51);"> </span></span></span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql 优化 sql