首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL Hash 索引 vs B-Tree 索引:原理差異、適用場景與選型指南

     編輯:MySQL 資料庫相關知識

核心結論先行

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、衝突鏈維護)

Hash 索引五大限制 (致命傷)

  1. 僅支援 =、IN、<=> 比較,無法處理範圍、排序、LIKE。
  2. 無法避免排序操作:雜湊值大小與原值無關,ORDER BY 必須 filesort。
  3. 複合索引無法部分使用:雜湊值基於完整鍵值計算,(a,b) 索引無法服務 WHERE a=1。
  4. 無法避免表掃描:雜湊衝突導致同桶多行,仍需回表比對完整鍵值。
  5. 低選擇性欄位效能崩潰:大量相同雜湊值集中同桶,退化為線性掃描,比 B-Tree 更慢。

InnoDB 自適應 Hash 索引 (AHI)

  • **內部機制**:InnoDB 監控 B+Tree 頁面訪問模式,熱點頁面自動在記憶體建立 Hash 索引加速等值查詢。
  • **使用者不可控**:無法手動建立/刪除,參數 innodb_adaptive_hash_index=ON/OFF 仅能全域開關。
  • **適用場景**:重複等值查詢熱點資料 (如查詢熱門商品 ID),自動提升至 O(1)。

Memory/Heap 引擎 Hash 索引實測


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 索引範圍掃描。

選型決策樹

  1. 引擎是 InnoDB/MyISAM?→ **只能用 B-Tree** (InnoDB AHI 自動)。
  2. 引擎是 Memory/Heap?
    • 純等值查詢、高選擇性、無排序需求 → USING HASH。
    • 其他所有情況 → USING BTREE (預設)。
  3. 需求範圍查詢/排序/部分匹配/覆蓋索引 → **B-Tree 唯一選擇**。

總結

Hash 索引理論 O(1) 吸引人,但功能殘缺嚴重,生產環境**極少手動建立**。InnoDB 透過 AHI 自動在適當時機發揮 Hash 優勢,使用者專注於設計優質 B+Tree 索引 (複合索引、覆蓋索引、最左前綴) 即可獲得最佳綜合效能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved