ORDER BY 觸發文件排序(filesort)會嚴重拖慢查詢。本文提供兩大優化思路:索引覆蓋排序、EXPLAIN 驗證排序模式。
條件:
WHERE 條件列為常數(非變量)ORDER BY 列與索引順序一致-- 表結構:is_active(常數查詢) + value(排序)
SELECT * FROM ad_user
WHERE is_active = 'Y'
ORDER BY value;
建立組合索引 INDEX idx_active_value (is_active, value),查詢直接按索引順序返回,零排序開銷。
ORDER BY 列混用 ASC/DESCWHERE 條件使用變量(參數化查詢)WHERE 與 ORDER BY 列不匹配GROUP BY 與 ORDER BY 表達式不一致當索引無法覆蓋排序時,調整會話/全局緩存:
sort_buffer_size:排序緩存,超過則用臨時文件read_buffer_size:順序讀緩存tmpdir:指向高性能存儲(SSD/內存盤),可多目錄分流EXPLAIN SELECT * FROM ad_user WHERE is_active='Y' ORDER BY value;
Using filesort → 觸發文件排序,需優化Using filesort → 走索引順序,零排序開銷關鍵優化:元組包含 SELECT 列,省去排序後再按行指針回表讀取。
ORDER BY 慢?
├─ 能加索引覆蓋? → 加組合索引(WHERE常數 + ORDER BY列)
├─ WHERE用變量? → 業務評估:固定SQL換性能 vs 動態參數換靈活
├─ 大表必排? → 調大 sort_buffer_size、tmpdir指向SSD
└─ 允許近似? → 應用層抽樣/預排序/緩存