Hash 索引因 O(1) 查找極快,但功能受限;B-Tree 索引功能全面、支援範圍查詢、排序、前綴匹配,是 MySQL 默認選擇。本文深度對比兩者差異,助你避開選型陷阱。
=、IN、<=> 等值過濾,性能遠超 B-Tree(需從根節點遍歷到葉節點)。| 限制 | 說明 | 影響 |
|---|---|---|
| 僅支援等值查詢 | Hash 碼大小關係 ≠ 原鍵值大小關係 | 無法用於 >、<、BETWEEN、LIKE 'prefix%' 範圍/前綴查詢 |
| 無法避免排序 | Hash 碼無序,無法利用索引順序 | ORDER BY、GROUP BY 仍需 filesort |
| 不支援部分索引鍵 | 組合索引整體計算 Hash,非最左前綴 | 無法用組合索引前列單獨查詢 |
| 無法避免表掃描 | Hash 衝突鏈表仍需回表比對 | 高衝突時性能退化至全表掃描 |
| 低選擇性性能差 | 大量鍵值映射同一 Hash 槽 | 長鏈表遍歷 + 多次回表,反而慢於 B-Tree |
| 引擎 | 默認索引 | 支援 Hash | 備註 |
|---|---|---|---|
| InnoDB | B+Tree | 自適應 Hash (AHI) | 不可手動建 Hash,AHI 由優化器自動管理 |
| MyISAM | B-Tree | 不支援 | |
| Memory/Heap | Hash | 支援 (USING HASH) | 可指定 USING BTREE 改用 B-Tree |
| NDB Cluster | Hash (主鍵) | 支援 | 主鍵查詢極快,範圍查詢需有序索引 |
USING HASH 極快。USING BTREE。誤區:「Hash 索引比 B-Tree 快,所以我要把所有索引改成 Hash。」
真相:Hash 僅在「高選擇性 + 純等值點查 + Memory 引擎」下完勝。InnoDB 不允許手動建 Hash,AHI 已在後台幫你做了該做的事。
**B-Tree 是關係型資料庫索引的基石**,功能完備、穩定可預期;**Hash 是特定場景(Memory 表、InnoDB AHI)的加速器**,不可通用。選型原則:**默認 B-Tree,只有在 Memory 表純等值點查且基數極高時才考慮 Hash**。