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

MySQL 聯合索引 vs 單列索引實測:為什麼有時單列更有效、索引列選擇決定成敗

     編輯:MySQL 綜合教學

實測兩張表(menu_employee MyISAM、l_insertlogs InnoDB),對比 FORCE INDEX 指定聯合索引 vs 單列索引在 WHERE ... AND ... ORDER BY 場景下的執行計劃差異。結論:聯合索引不總是優於單列,列序與查詢模式必須精準對齊,否則反而觸發 filesort。

一、 實測 1:menu_employee (MyISAM)


-- 表結構
KEY `x` (`employee_id`, `employee_pid`) USING BTREE

-- 查詢
EXPLAIN SELECT employee_name 
FROM menu_employee FORCE INDEX (x)
WHERE employee_id > 3 AND employee_pid > 20
ORDER BY employee_pid;
  • 聯合索引 (employee_id, employee_pid):Using index; Using filesort —— 命中索引但仍需排序!
  • 單列索引 (employee_pid):Using index —— 無 filesort,直接有序輸出!
  • 單列索引 (employee_id):Using index; Using filesort —— 需排序。

原因:聯合索引按 (employee_id, employee_pid) 排序,WHERE employee_id > 3 為範圍條件,導致 employee_pid 在索引中不再有序,必須 filesort。單列 employee_pid 索引天然有序,完美匹配 ORDER BY employee_pid。

二、 實測 2:l_insertlogs (InnoDB)


-- 表結構
KEY `x` (`Counts`, `ID`) USING BTREE

-- 查詢
EXPLAIN SELECT TablesName 
FROM l_insertlogs FORCE INDEX (x)
WHERE ID BETWEEN 100 AND 500 AND Counts > 14
ORDER BY Counts;
  • 聯合索引 (Counts, ID):Using where; Using filesort
  • 單列 ID (PK):Using where; Using filesort
  • 單列 Counts:Using index —— 唯一無 filesort 方案!

原因:ORDER BY Counts 需 Counts 有序。聯合索引首列為 Counts,但 WHERE ID BETWEEN ... 為範圍掃描,破壞了 Counts 的有序性。單列 Counts 索引直接有序輸出。

三、 核心規律總結

四、 實戰建議

  1. 先看 ORDER BY 列,嘗試單列索引,觀察 Extra 是否消失 filesort。
  2. 再看 WHERE 等值前綴,若能構成 (where_eq_col, order_col) 聯合索引且不引入範圍條件,嘗試聯合索引。
  3. 用 EXPLAIN 實測對比,以執行計劃為準,不憑經驗猜測。
  4. InnoDB 主鍵聚簇索引天然有序,ORDER BY pk 免索引。

索引設計是「查詢模式」與「B+Tree 有序性」的精準配對,實測勝過理論推演。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景最佳索引關鍵點
WHERE 等值 + ORDER BY 同列單列索引 (ORDER BY 列)範圍條件破壞聯合索引有序性
WHERE 等值前綴 + ORDER BY 後綴聯合索引 (WHERE列, ORDER BY列)等值不破壞有序,後綴保持有序
WHERE 範圍 + ORDER BY 另一列單列索引 (ORDER BY 列)聯合索引首列範圍 → 後綴無序
純 ORDER BY 無 WHERE單列索引 (ORDER BY 列)最簡直接