本文主要是介绍mysql优化之(use temporary、use filesort),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
一、use temporary
二、use filesort
三、extra的其它字段说明
一、use temporary
为了解决查询,MySQL需要创建一个临时表来容纳结果。
use temporary产生条件:
如果GROUP BY 的列没有索引,产生临时表.
如果GROUP BY时,SELECT的列不止GROUP BY列一个,并且GROUP BY的列不是主键 ,产生临时表.
如果GROUP BY的列有索引,ORDER BY的列没索引.产生临时表.
如果GROUP BY的列和ORDER BY的列不一样,即使都有索引也会产生临时表.
如果GROUP BY或ORDER BY的列不是来自JOIN语句第一个表.会产生临时表.
如果DISTINCT 和 ORDER BY的列没有索引,产生临时表.
如果group by 的列没有索引,必产生内部临时表,
如果order by 与group by为不同列时,或多表联查时order by ,group by 包含的列不是第一张表的列,将会产生临时表
解决方式:根据如上use temporary产生条件对应的解决,mysql也不会再使用use temporary。
二、use filesort
MySQL需要额外的一次传递,以对查询出的数据进行排序。文件排序(文件可能在磁盘,也可能在内存)。
需要注意的是:由于 Using filesort是使用算法在 内存中进行排序,MySQL对于排序的记录的大小也是有做限制:max_length_for_sort_data,默认为1024
show variables like '%max_length_for_sort_data%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| max_length_for_sort_data | 1024 |
+--------------------------+-------+
经过笔者测试,如果排序查询的数据两大于这个默认值的话,还是会使用Using filesort。
解决方式:当排序查询的数据量在默认值1024的范围内时,在排序的字段上加上索引可以提升MySQL查询的速度,mysql也不会再使用use filesort。
三、extra的其它字段说明
useing index: 是指用到了索引覆盖,效率非常高
using where 是指光靠索引定位不了,还得where判断一下
Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
Not exists:MySQL能够对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为前面的的行组合在该表内检查更多的行。
range checked for each record (index map: #):MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。
Using filesort:MySQL需要额外的一次传递,以找出如何按排序顺序检索行。
Using temporary:为了解决查询,MySQL需要创建一个临时表来容纳结果。
Using sort_union(...), Using union(...), Using intersect(...):这些函数说明如何为index_merge联接类型合并索引扫描。
Using index for group-by:类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查 询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。
————————————————
版权声明:本文为CSDN博主「Lei_Da_Gou」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Lei_Da_Gou/article/details/89448282
这篇关于mysql优化之(use temporary、use filesort)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!