"Using temporary; Using filesort" 这两个信息并不直接表示查询需要回表。它们是关于排序和临时表的不同优化器行为。
回表是指在使用二级索引查询时,需要根据索引中的主键值再去主键索引(聚簇索引)中查找完整记录的行为。这与上述两个术语是不同的概念:
Using temporary 常见场景: - 包含DISTINCT、GROUP BY或ORDER BY的查询,且这些子句中的列与索引不匹配 - UNION查询 - 派生表(子查询在FROM子句中)
Using filesort 常见场景: - ORDER BY子句中的列没有合适的索引 - GROUP BY子句隐式包含排序操作
要判断查询是否需要回表,应该查看EXPLAIN输出中的以下信息:
- type
列: 如果是"index"或"ref"等使用二级索引的情况
- Extra
列: 如果有"Using index"表示覆盖索引,不需要回表;没有则表示可能需要回表
如果同时出现性能问题: 1. 对于"Using filesort",考虑为ORDER BY/GROUP BY创建合适的索引 2. 对于"Using temporary",可能需要重写查询或增加内存临时表大小 3. 对于回表问题,考虑使用覆盖索引(包含查询所需的所有列)
"Using temporary; Using filesort"主要反映的是排序和临时表使用情况,而不直接表示回表行为。要分析回表问题,需要关注EXPLAIN的其他字段信息。