SELECT column_name(s)
FROM table_name
ORDER BY column_name [ASC|DESC];
SELECT col1, col2 FROM tbl ORDER BY sort_col;
-- 在 sort_col 上建索引即可優化
SELECT col1, col2 FROM tbl WHERE colX = val ORDER BY sort_col;
-- 建立聯合索引 (colX, sort_col)
注意: 若 WHERE colX IN (val1, val2...) 匹配多值,無法利用索引優化 ORDER BY。
SELECT * FROM tbl WHERE uid=1 ORDER BY x, y LIMIT 0,10;
-- 最佳索引:(uid, x, y) 而非 (x, y, uid)
| SQL 模式 | 是否用索引 | 說明 |
|---|---|---|
ORDER BY key_part1, key_part2... | ✅ | 順序與索引一致,全升序或全降序 |
WHERE key_part1=1 ORDER BY key_part1 DESC, key_part2 DESC | ✅ | WHERE 與 ORDER BY 使用同一索引前綴,方向一致 |
ORDER BY key_part1 DESC, key_part2 ASC | ❌ | 混合 ASC/DESC 導致索引失效 |
WHERE key2=const ORDER BY key1 | ❌ | WHERE 用索引 key2,ORDER BY 用 key1,不同索引 |
ORDER BY key1, key2 | ❌ | 涉及多個不同索引列 |
核心原則: WHERE 條件列與 ORDER BY 列組成的聯合索引順序一致、排序方向一致(全 ASC 或全 DESC)時,MySQL 可利用索引避免 Filesort。