399 字
2 分钟
MySQL 的 ORDER BY、GROUP BY 与 filesort
若索引顺序与过滤及排序要求匹配,MySQL 可以按索引顺序读取,避免额外排序。例如索引 (user_id, created_at) 可帮助 WHERE user_id=? ORDER BY created_at。若排序列顺序、方向或前缀条件与索引不兼容,执行计划可能显示 Using filesort。filesort 是 MySQL 对额外排序过程的名称,不代表一定写磁盘;数据量、内存和排序实现决定是否产生磁盘临时文件。
GROUP BY 的结果分组可能利用索引顺序,也可能需要临时表或排序。不要假设 GROUP BY 自动保证最终输出顺序;需要顺序时明确写 ORDER BY。MySQL 8.0 的执行策略和旧版本不同,旧资料中关于隐式分组排序的结论不能照搬。
优化时先检查过滤与排序字段能否用合理联合索引、返回行数是否过大,再看 EXPLAIN 的 Using filesort、Using temporary。排序索引会增加写入维护成本,也可能因选择性和 LIMIT 使优化器选择其他计划。ORDER BY 的升降序与复合索引方向支持需按具体版本和索引定义核验。
追问
- filesort 一定慢吗? 不一定,少量结果排序可能比维护更宽索引便宜。
- GROUP BY 一定会按分组列排序吗? 不应依赖隐式顺序;需要确定输出顺序就显式
ORDER BY。 - 如何确认索引消除了排序? 查看执行计划是否仍有排序操作,并对照执行时间、扫描行数和真实数据分布。
MySQL 的 ORDER BY、GROUP BY 与 filesort
https://blog.xqcherry.top/posts/interview/mysql/order-by-group-by-filesort/ 目录