採用 MySQL 官方 employees 測試庫(ER 圖見文中),數據量百萬級,適合驗證索引策略。
表 titles 主鍵 (emp_no, title, from_date),輔助索引 emp_no 已刪除,專注分析主鍵行為。
| 場景 | SQL 片段 | 索引使用 | key_len | 說明 |
|---|---|---|---|---|
| 全列精確匹配 | WHERE emp_no=... AND title=... AND from_date=... | 全用 | 59 | 順序無關,優化器自動調整 |
| 最左前綴匹配 | WHERE emp_no=... | 部分用 | 4 | 僅用第一列 |
| 中間列缺失 | WHERE emp_no=... AND from_date=... | 部分用 | 4 | title 缺失導致後列不可用 |
| 非最左列 | WHERE from_date=... | 全表掃描 | NULL | 索引無效 |
| 前綴模糊 | WHERE emp_no=... AND title LIKE 'Senior%' | 範圍查詢 | 56 | 僅尾部通配符可用 |
| 範圍查詢 | WHERE emp_no<'10010' AND title=... | 部分用 | 4 | 範圍列後列不可用 |
| 函數/表達式 | WHERE left(title,6)='Senior' | 失效 | 4 | 任何列運算導致該列索引失效 |
當中間列基數極小(如 title 僅 7 種值)時,可用 IN 列舉所有值形成最左前綴:
WHERE emp_no=...
AND title IN ('Senior Engineer','Staff',...)
AND from_date=...
實測 key_len 從 4 升至 59,性能微幅提升;若中間列基數大則需建輔助索引。
選擇性 = Cardinality / 總行數,越接近 1 越好。
title 選擇性 0.000016 → 不建單列索引;employees 表 first_name 選擇性 0.0042,(first_name, last_name) 0.9313 但長度 30;(first_name, left(last_name,4)) 選擇性 0.9007、長度 18,建立前綴索引後查詢快 120 倍。前綴索引限制:不可用於 ORDER BY/GROUP BY,無法實現覆蓋索引。
業務無關的自增整數。
OPTIMIZE TABLE。圖示對比見文中「圖13 緊湊結構」vs「圖14 碎片結構」。