Hash 索引查詢 O(1) 極快,但功能受限;B-Tree 索引功能全面、範圍查詢高效,是 MySQL 預設主流。本文深度對比兩者原理、五大限制、InnoDB B+Tree 具體結構與選型建議。
=、IN、<=>)單次定位,無需樹遍歷。| 限制 | 說明 | 例子 |
|---|---|---|
| 不支援範圍查詢 | Hash 值大小序與原鍵值序無關 | WHERE id > 100 無法用索引 |
| 無法避免排序 | 索引順序非鍵值順序 | ORDER BY id 仍需 filesort |
| 不支援部分前綴查詢 | 複合索引整體算 Hash,非單列 | INDEX(a,b) 查 WHERE a=1 失效 |
| 無法完全避免回表 | Hash 衝突需比對實際鍵值 | 同一桶多條記錄仍需回表比對 |
| 低選擇性時效能劣化 | 大量鍵值落同一桶,退化為鏈表掃描 | 性別、狀態碼等低基數列 |
CREATE INDEX ... USING HASH,MySQL 僅 Memory 引擎顯式支援,InnoDB 自適應 Hash 索引(AHI)由引擎自動管理不可手動建立。Q: 1000 萬條記錄建索引,最適合哪種結構? A: B-Tree(B+Tree)。Hash 不支援範圍查詢、排序、部分前綴,通用性差。
Q: 主鍵索引是 Hash 嗎? A: 不是,InnoDB 主鍵是聚簇 B+Tree 索引。