插件窝 干货文章 EXPLAIN 显示 "Using temporary; Using filesort",这是否意味着查询需要回表?

EXPLAIN 显示 "Using temporary; Using filesort",这是否意味着查询需要回表?

Using 索引 需要 temporary 974    来源:    2025-03-30

关于 "Using temporary; Using filesort" 和回表的关系分析

简短回答

"Using temporary; Using filesort" 这两个信息并不直接表示查询需要回表。它们是关于排序和临时表的不同优化器行为。

详细解释

1. 这两个术语的含义

  • Using temporary: 表示MySQL需要创建临时表来存储中间结果
  • Using filesort: 表示MySQL需要进行额外的排序操作

2. 与回表(Back to Table)的关系

回表是指在使用二级索引查询时,需要根据索引中的主键值再去主键索引(聚簇索引)中查找完整记录的行为。这与上述两个术语是不同的概念:

  • 回表是索引访问方式的问题
  • "Using temporary"和"Using filesort"是查询执行过程中的操作

3. 何时会出现这些提示

Using temporary 常见场景: - 包含DISTINCT、GROUP BY或ORDER BY的查询,且这些子句中的列与索引不匹配 - UNION查询 - 派生表(子查询在FROM子句中)

Using filesort 常见场景: - ORDER BY子句中的列没有合适的索引 - GROUP BY子句隐式包含排序操作

4. 如何判断是否需要回表

要判断查询是否需要回表,应该查看EXPLAIN输出中的以下信息: - type列: 如果是"index"或"ref"等使用二级索引的情况 - Extra列: 如果有"Using index"表示覆盖索引,不需要回表;没有则表示可能需要回表

5. 优化建议

如果同时出现性能问题: 1. 对于"Using filesort",考虑为ORDER BY/GROUP BY创建合适的索引 2. 对于"Using temporary",可能需要重写查询或增加内存临时表大小 3. 对于回表问题,考虑使用覆盖索引(包含查询所需的所有列)

总结

"Using temporary; Using filesort"主要反映的是排序和临时表使用情况,而不直接表示回表行为。要分析回表问题,需要关注EXPLAIN的其他字段信息。