首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL ORDER BY 語法詳解與索引優化實戰:避免 Filesort 的核心技巧

     編輯:MySQL 資料庫相關知識

基礎語法

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 — **需優化**,出現此項說明未用索引排序
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved