索引是查詢加速器,但濫用會拖垮寫入。本文系統梳理五大索引類型定義、創建語法、組合索引最左前綴原則、建立時機判斷、索引不足與七大使用注意事項,構建完整索引治理認知。
| 類型 | 特徵 | 創建語法 | 適用場景 |
|---|---|---|---|
| 普通索引 | 無約束,加速查詢 | INDEX idx_name (col) | 高選擇性過濾列、排序列 |
| 唯一索引 | 值唯一,允許 NULL | UNIQUE INDEX uk_name (col) | 業務鍵:郵箱、手機、身份證 |
| 主鍵索引 | 唯一+非空+聚簇 | PRIMARY KEY (id) | 每表必有,建議無意義自增 |
| 全文索引 | 分詞倒排,MATCH查詢 | FULLTEXT INDEX ft_content (content) | 長文本搜尋,5.6+ InnoDB 支持 |
| 組合索引 | 多列有序,最左前綴 | INDEX idx_a_b_c (a,b,c) | 多列聯合過濾/排序/分組 |
INDEX idx_a_b_c (a, b, c)
-- 能用到索引的查詢:
WHERE a = ? -- ✅
WHERE a = ? AND b = ? -- ✅
WHERE a = ? AND b = ? AND c = ? -- ✅
WHERE a = ? AND c = ? -- ⚠️ 僅用 a,c 無法用索引
WHERE b = ? -- ❌ 全掃
WHERE b = ? AND c = ? -- ❌ 全掃
本質:B+Tree 按 (a,b,c) 字典序排序,只有前綴有序才能二分查找。
WHERE、JOIN ON、ORDER BY、GROUP BY 出現的高選擇性列LIKE 'abc%' 後綴通配可用索引,LIKE '%abc%' 不可VARCHAR(255) 實際區分度在前 10 字符 → INDEX idx_name (name(10)),節省空間、提速。WHERE 用了索引,ORDER BY 列不再用索引;需排序時建組合索引 (where_col, order_col)。LIKE 'abc%' 走索引,LIKE '%abc' 全掃。YEAR(dt) < 2024 → dt < '2024-01-01'。NOT EXISTS/LEFT JOIN ... IS NULL。SELECT a,b FROM t WHERE c=? → INDEX idx_c_ab (c,a,b),避免回表。
高選擇性 + 高頻過濾/排序/分組/關聯 → 建索引
低選擇性 / 小表 / 含NULL / 函數包裹 → 不建
組合索引遵循最左前綴,單表≤6個
覆蓋索引消除回表,短索引省空間
定期ANALYZE TABLE更新統計,防優化器迷路
索引治理 = 類型選對 + 列序排對 + 定期養護。