索引儲存分類
| 儲存引擎 | 資料與索引儲存方式 | 支援索引類型 |
| MyISAM | 分離儲存(.MYD/.MYI) | B-Tree |
| InnoDB | 共享表空間(可多檔案) | B-Tree |
| MEMORY/HEAP | 記憶體 | Hash、B-Tree |
注意:MySQL 不支援函數索引,但支援**前綴索引**(如 `name(4)`),可大幅縮減索引體積。
MySQL 如何使用索引
核心原則:**查詢條件必須包含索引鍵值**,複合索引遵循**最左前綴原則**。
✅ 會使用索引的場景
- 複合索引 `(a,b,c)`,查詢條件包含 `a`、`a,b`、`a,b,c`
- `LIKE 'prefix%'` 固定前綴查詢
- `col IS NULL`(col 為索引列)
- 全文索引配合 `MATCH() AGAINST()`
❌ 存在索引但不會使用的場景
- 優化器判斷全表掃描更快(如範圍覆蓋 90% 以上資料)
- MEMORY/HEAP 表非 `=` 條件
- `OR` 連接條件兩側索引不完整
- 非索引列第一部分(違反最左前綴)
- `LIKE '%suffix'` 以萬用字元開頭
- 字串列條件未加引號導致隱式轉換
索引設計黃金法則
- 高選擇性優先:唯一值越多(選擇性越高)越適合建索引
- 複合索引遵循最左原則:`WHERE a=1 AND b=2` → 索引 `(a,b)`
- 覆蓋索引:`SELECT a,b FROM t WHERE c=1` → 索引 `(c,a,b)` 避免回表
- 避免過度索引:每個索引增加寫入開銷,單表建議 ≤ 5 個
- 前綴索引權衡:長字串取前 N 字元,平衡大小與選擇性
驗證索引效果
EXPLAIN SELECT * FROM t WHERE idx_col = 1;
關鍵欄位解讀:
- `type`:`const`/`eq_ref`/`ref`/`range`/`index`/`ALL`(由優到劣)
- `key`:實際使用的索引
- `rows`:預估掃描行數(越小越好)
- `Extra`:`Using index`(覆蓋索引)、`Using where`、`Using filesort`(需優化)
狀態變數監控
- `Handler_read_key` 高 → 索引命中好
- `Handler_read_rnd_next` 高 → 全表掃描多,需檢查索引或 SQL
總結
索引是資料庫效能的放大器,但也是雙面刃。掌握 B-Tree 原理、最左前綴、覆蓋索引、前綴索引,配合 `EXPLAIN` 持續驗證,才能讓索引真正發揮效能倍增器的作用。