B-Tree (B+Tree) 是通用首選,Hash 索引僅適合純等值查詢 (Memory/Heap 引擎)。InnoDB 自適應 Hash 索引 (AHI) 由引擎內部自動管理,使用者無法直接建立。
| 維度 | B-Tree (B+Tree) | Hash Index |
|---|---|---|
| 資料結構 | 平衡多路搜尋樹,葉節點鏈表 | 雜湊表 (Hash Table),桶 + 鏈表解決衝突 |
| 查找複雜度 | O(log N),穩定 | O(1) 平均,最差 O(N) (嚴重衝突) |
| 範圍查詢 | ✅ 支援 (<, >, BETWEEN, LIKE 前綴) | ❌ 不支援,雜湊值無序 |
| 排序/分組 | ✅ 索引天然有序,避免 filesort | ❌ 無序,需額外排序 |
| 部分匹配 | ✅ 最左前綴原則 | ❌ 必須完整鍵值計算雜湊 |
| 覆蓋索引 | ✅ 支援 | ❌ 不支援 (僅存雜湊值+指標) |
| 空間佔用 | 較大 (含完整鍵值) | 較小 (定長雜湊值) |
| 維護成本 | 中等 | 高 (Rehash、衝突鏈維護) |
ORDER BY 必須 filesort。(a,b) 索引無法服務 WHERE a=1。innodb_adaptive_hash_index=ON/OFF 仅能全域開關。
CREATE TABLE t_hash (id INT PRIMARY KEY, val VARCHAR(20)) ENGINE=MEMORY;
CREATE TABLE t_btree (id INT PRIMARY KEY, val VARCHAR(20)) ENGINE=MEMORY;
-- MEMORY 引擎預設 Hash 索引,可指定 USING BTREE
ALTER TABLE t_hash ADD INDEX idx_val (val) USING HASH;
ALTER TABLE t_btree ADD INDEX idx_val (val) USING BTREE;
測試:等值查詢 Hash 快 10-20%;範圍查詢 Hash 全表掃描,B-Tree 索引範圍掃描。
USING HASH。USING BTREE (預設)。Hash 索引理論 O(1) 吸引人,但功能殘缺嚴重,生產環境**極少手動建立**。InnoDB 透過 AHI 自動在適當時機發揮 Hash 優勢,使用者專注於設計優質 B+Tree 索引 (複合索引、覆蓋索引、最左前綴) 即可獲得最佳綜合效能。