首页/数据/数据库速查/排序与临时表:filesort 与 temporary 的优化
SQL 语法52 条

排序与临时表:filesort 与 temporary 的优化

ORDER BY / GROUP BY / DISTINCT 无索引支撑会走 filesort 或临时表;优化方向是让排序分组列与索引前缀对齐。

数据库速查数据更新于 2026-10-12
用途消除排序与临时表
信号Extra: Using filesort / Using temporary
手段索引对齐、缩减行数、调小结果

优化示例

优化示例
-- 差:排序方向与索引不一致
SELECT * FROM orders WHERE user_id=42 ORDER BY created_at DESC LIMIT 10;
-- 好:建联合索引 (user_id, created_at)
ALTER TABLE orders ADD INDEX idx_user_created (user_id, created_at);

-- GROUP BY 临时表:确认分组列有索引
EXPLAIN SELECT status, COUNT(*) FROM orders GROUP BY status;
小结果集上的 filesort 未必慢;阈值由 sort_buffer_size 与行数决定,先量化再优化。

易错点

  • ORDER BY 方向与复合索引方向不一致时仍会 filesort(8.0 可建降序索引解决)
  • 盲目调大 sort_buffer_size 会加剧内存压力,按并发与实例内存预算设置

数据来源与参考

  • MySQL 8.0 Reference Manual: ORDER BY Optimization

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌