| 維度 | 單列索引 | 組合索引 (聯合索引) |
|---|---|---|
| 定義 | 單個列上建立的索引 | 多個列組合建立的單個索引,鍵值為列值拼接 |
| 結構 | B+樹,葉子節點存 (列值, 主鍵/RowID) | B+樹,葉子節點存 (列1值, 列2值..., 主鍵/RowID),按定義順序排序 |
| 查詢匹配 | 精確匹配該列 | 遵循最左前綴原則,從最左列開始連續匹配 |
| 維護成本 | 低 (單列寫入更新) | 高 (多列寫入需更新一個索引,但比多個單列索引低) |
| 存儲空間 | 單列索引大小 | 通常小於多個單列索引總和 (共享 B+樹節點) |
CREATE TABLE myIndex (
i_testID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
vc_Name VARCHAR(50) NOT NULL,
vc_City VARCHAR(50) NOT NULL,
i_Age INT NOT NULL,
i_SchoolID INT NOT NULL
) ENGINE=InnoDB;
-- 模擬 10000 行數據,vc_Name='erquan' 有 5 行,city/age/school 組合各異
SELECT i_testID FROM myIndex
WHERE vc_Name='erquan' AND vc_City='鄭州' AND i_Age=25;
ALTER TABLE myIndex ADD INDEX idx_name (vc_Name);
ALTER TABLE myIndex ADD INDEX idx_city (vc_City);
ALTER TABLE myIndex ADD INDEX idx_age (i_Age);
執行流程:
vc_Name,過濾出 5 行)vc_City='鄭州' 和 i_Age=25缺點: 只能利用一個索引,其餘條件需回表後過濾,隨著數據量增長,回表開銷線性增長。
ALTER TABLE myIndex ADD INDEX idx_name_city_age (vc_Name(10), vc_City, i_Age);
設計細節:
vc_Name(10):前綴索引,名字通常 ≤ 10 字,大幅減小索引體積、提升寫入速度、加快掃描vc_Name (高選擇性) → vc_City → i_Age,符合查詢 WHERE 順序執行流程: 直接在 B+樹上按 (erquan, 鄭州, 25) 定位唯一葉子節點,零回表、零全掃描、毫秒級返回。
組合索引 (a, b, c) 的 B+樹排序邏輯:先按 a 排序,a 相同再按 b,以此類推。因此:
WHERE a = 1
WHERE a = 1 AND b = 2
WHERE a = 1 AND b = 2 AND c = 3
WHERE a = 1 AND b > 2 -- b 範圍查詢,c 失效
WHERE a = 1 AND b LIKE 'xyz%' -- 前綴模糊匹配
WHERE b = 2 -- 缺最左列 a
WHERE c = 3 -- 缺 a,b
WHERE b = 2 AND c = 3 -- 缺 a
WHERE a = 1 AND c = 3 -- 中間斷層,c 失效 (僅用到 a)
WHERE a > 1 AND b = 2 -- a 範圍查詢,b 失效
對於 WHERE a=1 AND b LIKE 'xyz%' AND c=3,傳統需回表過濾 c,ICP 在存儲引擎層直接過濾 c,減少回表次數。
VARCHAR(255) → INDEX idx_col (col(10)),驗證 SELECT COUNT(DISTINCT LEFT(col,10))/COUNT(*) FROM tbl 區分度SELECT a,b FROM t WHERE c=1 → INDEX idx_c_ab (c,a,b)
-- 查看索引使用情況
SHOW INDEX FROM myIndex;
EXPLAIN SELECT ...; -- 關注 type=ref/range, key=idx_name_city_age, rows=1
-- 監控未使用索引 (sys schema)
SELECT * FROM sys.schema_unused_indexes;
-- 監控冗余索引
SELECT * FROM sys.schema_redundant_indexes;
組合索引通過「最左前綴」機制,將多維查詢條件壓縮為單一 B+樹查找路徑,是高性能查詢的核心利器。單列索引僅適用於單列高頻過濾場景。實戰中:分析慢查詢 → 提取 WHERE/JOIN/ORDER BY 列 → 按選擇性排序 → 建組合索引 → EXPLAIN 驗證 → 監控命中率,形成閉環。記住:索引是把雙刃劍,讀快寫慢,精準建立,定期清理。