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

MySQL Hash 索引 vs B-Tree 索引:原理、優缺點與選型指南

     編輯:MySQL 資料庫相關知識

核心差異

維度Hash 索引B-Tree 索引
底層結構哈希表平衡樹
查找複雜度O(1) 一次定位O(log N) 多層遍歷
等值查詢 (=, IN, <=>)極快快
範圍查詢 (>, <, BETWEEN, LIKE)不支援支援
排序優化 (ORDER BY)不支援支援(索引有序)
最左前綴原則不支援(組合鍵整體 Hash)支援
覆蓋索引掃描不可避免回表(Hash 值衝突需比對原值)支援
適用引擎Memory、NDB ClusterInnoDB、MyISAM、InnoDB 默認

為什麼不全用 Hash?五大限制

  1. 僅支援等值匹配:Hash 計算後值的大小序與原值無關,無法做範圍過濾。
  2. 無法利用索引排序:Hash 值無序,ORDER BY 仍需 filesort。
  3. 組合索引無最左前綴:(a,b) Hash 是對 a+b 整體 Hash,單查 a 無法命中。
  4. 必須回表驗證:不同鍵值可能同 Hash(碰撞),引擎仍需讀數據行比對原值。
  5. 選擇性低時性能崩塌:大量鍵值映射同一 Hash 桶,退化為鏈表掃描,反而比 B-Tree 慢。

選型建議

  • InnoDB/MyISAM 表:只能用 B-Tree,無選擇。
  • Memory 表:
    - 純等值查詢、數據近似唯一(如 ID 查找)→ USING HASH 極快。
    - 需範圍、排序、組合鍵前綴查詢 → USING BTREE(默認)。
  • NDB Cluster:主鍵默認 Hash,唯一鍵可選 B-Tree。

創建語法

-- Memory 表指定 Hash
CREATE TABLE t (id INT PRIMARY KEY, val VARCHAR(20)) ENGINE=MEMORY;
CREATE INDEX idx_val ON t (val) USING HASH;

-- InnoDB 無法指定 Hash,隱式自適應哈希索引 (AHI) 由引擎自動管理

InnoDB 的自適應哈希索引 (AHI) 會在熱點頁面上自動構建 Hash 索引加速等值查詢,屬於引擎內部優化,用戶無感知、無法干預,但可通過 innodb_adaptive_hash_index=OFF 關閉。

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