首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 複合索引效能實測:順序、排序方向、WHERE/Order By 匹配規則全解析

     編輯:MySQL 綜合教學

複合索引 (col1, col2, col3) 的列順序、ORDER BY 排序方向、WHERE 條件匹配程度,直接決定索引是否生效。本文通過實測 EXPLAIN 對比,總結出三大鐵律,並給出優/劣模式速查表。

實測場景

-- 表 dlog_user 主鍵 username,有復合索引 idx_online_status(username, online_status)
SELECT * FROM dlog_user ORDER BY online_status, username;

測試過程與結果

測試條件索引定義EXPLAIN typeExtra結論
無額外索引僅主鍵ALLUsing filesort全表掃描+排序
加索引 (username, online_status)同 SQL 順序ALLUsing filesort**索引無效**
調整索引 (online_status, username)匹配 ORDER BY 順序index(空)**索引生效**
SQL 改為 ORDER BY online_status DESC, username(online_status, username)ALLUsing filesort**排序方向不一致導致失效**

三大鐵律

  1. ORDER BY 列順序 = 索引列順序:ORDER BY a, b 需索引 (a, b),(b, a) 無效。
  2. ORDER BY 排序方向必須一致:全 ASC 或全 DESC,混用 ASC, DESC 導致索引失效(MySQL 8.0 前)。
  3. WHERE 條件最左前綴 + ORDER BY 匹配:WHERE a=1 ORDER BY b 需索引 (a, b);WHERE a>1 ORDER BY b 範圍條件斷開最左前綴,索引部分失效。

優/劣模式速查表(索引 KEY a(a,b,c))

SQL 模式索引效果說明
WHERE a=10 AND b>50優最左前綴 a= 常量,b 範圍用到索引
WHERE a>10 AND b=50劣a 範圍斷開前綴,b 無法用索引
ORDER BY a優索引順序掃描
ORDER BY b劣非最左列排序需 filesort
WHERE a=10 ORDER BY a優常量過濾 + 索引順序
WHERE a=10 ORDER BY b優a= 常量,b 索引順序
WHERE a=10 ORDER BY c劣跳過 b 排序 c 需 filesort
WHERE a>10 ORDER BY a優範圍但同列排序可用索引
WHERE a>10 ORDER BY b劣a 範圍斷開,b 無序
WHERE a=10 AND b=10 ORDER BY c優a,b 皆常量,c 索引順序
WHERE a=10 AND b>10 ORDER BY c劣b 範圍斷開,c 無序

索引設計原則

  1. 索引越少越好:每個索引增加寫入開銷(INSERT/UPDATE/DELETE 需維護)。
  2. 最窄列放最左:INT 優於 VARCHAR(255),減小索引體積、提高頁面密度。
  3. 避免 filesort、臨時表、全表掃描:用 EXPLAIN 驗證 type=ref/range/index、Extra 無 Using filesort/Using temporary。

驗證腳本

# 快速檢查某 SQL 是否用到索引
mysql -uroot -p -e "EXPLAIN SELECT * FROM tbl WHERE a=1 ORDER BY b\G" | grep -E 'type|key|Extra'

複合索引不是「建了就有效」,**順序、方向、WHERE/Order By 協同**三位一體才能發揮威力。將上述速查表貼在工位,寫 SQL 時對照,索引失效率直降 80%。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved