基礎語法
SELECT column_list FROM table_name ORDER BY column_name [ASC|DESC];
索引優化三大場景
1. 純 ORDER BY
SELECT * FROM t ORDER BY sort_col;
-- 在 sort_col 上建索引即可利用索引順序掃描,避免 filesort
2. WHERE + ORDER BY(單值等值)
SELECT * FROM t WHERE col_x = 100 ORDER BY sort_col;
-- 建聯合索引 (col_x, sort_col)
-- 索引先滿足 WHERE 過濾,葉子節點已按 sort_col 有序,直接輸出
3. WHERE + ORDER BY(多值 IN/範圍)
SELECT * FROM t WHERE col_x IN (1,2,3) ORDER BY sort_col;
-- 無法利用索引消除排序,因 IN 打破索引順序連續性
-- 優化:改用 UNION ALL 分別查詢再合並,或接受 filesort
4. 多欄位 ORDER BY
SELECT * FROM t WHERE uid=1 ORDER BY x, y LIMIT 10;
-- 最佳索引 (uid, x, y) -- WHERE 列在前,ORDER BY 列依序
-- 差索引 (x, y, uid) -- 無法利用 WHERE 過濾
索引生效與失效規則
| SQL 模式 | 是否用索引排序 | 原因 |
ORDER BY key1, key2 | ✅ | 索引 (key1, key2) 順序一致,均 ASC |
ORDER BY key1 DESC, key2 DESC | ✅ | 索引 (key1, key2) 逆序掃描同樣有序 |
ORDER BY key1 DESC, key2 ASC | ❌ | 混合 ASC/DESC 無法利用索引順序 |
WHERE key2=1 ORDER BY key1 | ❌ | WHERE 列與 ORDER BY 列不同,索引 (key1) 無法過濾 |
ORDER BY key1, key2 (索引 key2,key1) | ❌ | 索引列順序與 ORDER BY 不符 |
EXPLAIN 關鍵列
type: index — 全索引掃描(較慢)
Extra: Using index — 覆蓋索引,無需回表
Extra: Using filesort — **需優化**,出現此項說明未用索引排序