摆脱“Using temporary; Using filesort”

10

当我对我的查询进行explain时

enter image description here

我发现在第一行的“Extra”下面出现了“Using temporary; Using filesort”。我知道这是不好的,但我不知道它具体是什么意思,也不知道如何修复它。

如果您想看到我的查询,请参阅我提出的一个更一般的问题:MySQL query optimization and EXPLAIN for a noob。 该查询涉及24个表和23个连接。

我的问题是:

  • "Using temporary"和"Using filesort"是什么意思?
  • 假设它们不好,我该怎么处理?

1
我认为它的意思是“查询优化器无法使用表上的索引按最终顺序检索数据;结果集可能太大而无法放入内存;因此,中间结果将存储在文件中,然后进行排序”。当DBMS使用临时文件并对其进行排序时,并不一定是自动坏事;这可能是回答查询的最佳方式(优化器认为是这样)。 - Jonathan Leffler
1
由于排序字段上没有索引,它正在使用文件排序。考虑在所需字段上添加索引。如果您想让我们帮助,请发布您的表创建语句和查询。 - Konerak
1个回答

7

如前所述,“using filesort”和“using temporary”并不总是意味着性能差。

这里有一些改善ORDER BY语句性能的基本指南。重点如下:

如果您想提高ORDER BY速度,请检查是否可以让MySQL使用索引而不是额外的排序阶段。如果不可能,您可以尝试以下策略:

增加sort_buffer_size变量的大小。

增加read_rnd_buffer_size变量的大小。

通过仅声明足以容纳其中存储的值的列来减少每行使用的RAM。例如,如果值从未超过16个字符,则CHAR(16)比CHAR(200)更好。

首先尝试使用索引(确保您要排序的字段具有索引)。请注意,增加系统变量sort_buffer_sizeread_rnd_buffer_size也可能对其他查询产生负面影响-考虑为您需要它们的会话单独设置它们,并将它们保留为所有其他会话的默认设置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接