Adaptive Hash Index (AHI) 是 InnoDB 獨有的「數據庫自優化」機制:當觀測到熱點 B+ 樹索引頁被高頻訪問時,自動在內存中構建哈希索引,將 O(log N) 的樹搜索降為 O(1) 哈希查找,大幅提升點查與範圍查詢首頁定位效能。
innodb_adaptive_hash_index=ON/OFF(預設開啟)| 維度 | B+ 樹 | 哈希索引 |
|---|---|---|
| 查找複雜度 | O(log N) | O(1) |
| 範圍查詢 | 支援 | 不支援 |
| 排序/分組 | 支援 | 不支援 |
| 記憶體佔用 | 較大 | 較小(僅熱點頁) |
| 維護開銷 | 寫入需分裂/合併 | 構建快、無結構變更 |
AHI 並非替代 B+ 樹,而是為熱點查詢加速的補充層。
InnoDB 統計每種操作類型對葉子頁的命中次數,當:
同類型操作命中同一葉頁次數 > 頁記錄數 / 16
即將該頁納入哈希索引。這意味著:
設計哲學:Self-Tuning(自調優),減少 DBA 手動干預。
SHOW ENGINE INNODB STATUS \G -- 關鍵區段: ------------------------------------- INSERT BUFFER AND ADAPTIVE HASH INDEX ------------------------------------- Hash table size 553229, node heap has 17 buffer(s) 0.00 hash searches/s, 0.00 non-hash searches/s SHOW VARIABLES LIKE '%adaptive_hash%'; +----------------------------+-------+ | Variable_name | Value | +----------------------------+-------+ | innodb_adaptive_hash_index | ON | +----------------------------+-------+
Hash table size:哈希表槽位數(質數)hash searches/s:每秒哈希命中次數non-hash searches/s:退回 B+ 樹搜索次數| 場景 | 建議 |
|---|---|
| 高並發點查、熱點數據集較小 | 保持開啟,效能增益明顯 |
| 大量範圍掃描、全表掃描為主 | 效益有限,可考慮關閉省內存 |
| 寫入極其頻繁、熱點頁快速變化 | AHI 維護開銷可能抵消收益,壓測決策 |
| 內存極度受限 | 關閉釋放哈希表內存 |
AHI 是 InnoDB 向內存數據庫架構邁進的關鍵一步,將「觀測-學習-優化」閉環內核化。大多數 OLTP 負載受益顯著,建議預設開啟,並通過 SHOW ENGINE INNODB STATUS 觀察 hash searches/s 與 non-hash searches/s 比值評估實際收益。