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

MySQL ORDER BY 索引優化:哪些情況用得上索引、哪些用不上

     編輯:MySQL 資料庫相關知識

可使用索引滿足 ORDER BY 的情況

MySQL 可直接利用索引順序避免額外排序,條件是:未使用的索引部分與所有 ORDER BY 欄位皆包含在 WHERE 條件中。

範例(假設複合索引 key_part1, key_part2,...)

SELECT * FROM t1 ORDER BY key_part1, key_part2, ...;
SELECT * FROM t1 WHERE key_part1 = constant ORDER BY key_part2;
SELECT * FROM t1 WHERE key_part1 = constant GROUP BY key_part2;
SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 DESC;
SELECT * FROM t1 WHERE key_part1 = 1 ORDER BY key_part1 DESC, key_part2 DESC;

無法使用索引的情況

情況範例說明
ORDER BY 欄位來自不同索引ORDER BY key1, key2索引無法合併排序
非連續索引部分排序WHERE key2=const ORDER BY key_part2跳過 key_part1 導致索引不可用
混用 ASC/DESCORDER BY key_part1 DESC, key_part2 ASC方向不一致無法利用索引順序
搜尋索引與排序索引不同WHERE key2=const ORDER BY key1需先檢索再排序
多表 JOIN 且 ORDER BY 欄位非來自第一個非 const 表—EXPLAIN 中第一表 join_type 非 const
ORDER BY 與 GROUP BY 表達式不同—需額外排序
索引非按序儲存(HASH/HEAP 表)—本身無序

判斷是否使用索引

執行 EXPLAIN SELECT ... ORDER BY ...,若 Extra 欄位顯示 Using filesort 表示未使用索引,需額外排序。

Filesort 演算法演進

  • MySQL 4.1 前: 兩次讀取資料(一次篩選、一次排序後隨機讀取)
  • 4.1+ 改進: 「元組」包含索引鍵、記錄指標、查詢需求欄位,排序後直接從元組讀取,避免二次讀表
  • 權衡:元組較大,可能超出 sort_buffer_size 導致更多 I/O,僅當額外欄位總長超過 max_length_for_sort_data 才啟用

優化建議

  1. 優先設計索引滿足 ORDER BY,避免 filesort
  2. 增大 sort_buffer_size
  3. 增大 read_rnd_buffer_size
  4. 將 tmpdir 指向大空間專用檔案系統(多路徑循環分佈於不同實體磁碟)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved