MySQL 可利用索引直接滿足 ORDER BY/GROUP BY,避免 Using filesort,前提是:
-- 1. 純索引排序
SELECT * FROM t1 ORDER BY key_part1, key_part2;
-- 2. WHERE 常量過濾 + 索引排序
SELECT * FROM t1 WHERE key_part1 = 10 ORDER BY key_part2;
-- 3. 組合索引前綴過濾 + 後綴排序
SELECT * FROM t1 WHERE key_part1 = 10 GROUP BY key_part2;
-- 4. 全 DESC 排序
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 DESC;
| 場景 | 示例 | 原因 |
|---|---|---|
| 多索引混合排序 | ORDER BY key1, key2 | 非同一組合索引 |
| 非連續索引列 | WHERE key2=1 ORDER BY key_part2 | 跳過 key_part1 破壞前綴 |
| 混合 ASC/DESC | ORDER BY key1 DESC, key2 ASC | 索引無法雙向掃描 |
| 過濾列與排序列不同索引 | WHERE key2=1 ORDER BY key1 | 需回表再排序 |
| 非順序存儲引擎 | HEAP/MEMORY 表 | Hash 索引無序 |
Using index:覆蓋索引,無回表、無排序Using filesort:觸發文件排序,性能隱患Using temporary; Using filesort:臨時表+排序,最慢索引基數 = 不同值數量。基數/總行數 > 30% 時優化器傾向使用索引;性別、狀態等低基數列(<1%),全表掃描反而更快。
INDEX (status, created_at)FORCE INDEX (idx_xxx) 干預優化器(慎用)ORDER BY id LIMIT 10 配合主鍵索引極快