8.0 預設值
ON
8.4 預設值
OFF
Dynamic
Yes
需特別關注
需特別關注

簡介

該參數用來設置是否開啟 adaptive hash index。

說明

在 InnoDB 架構圖中可以在 buffer pool 旁邊看到 Adaptive Hash Index:
notion image
MySQL 會自動根據觀察到的查詢狀況,自動為 index key 的前綴在內存中建立 Hash index。
Hash index 僅使用在 = 或 <=> 中使用並且速度比 B+Tree 索引快,但是不使用於範圍查詢、order by、LIKE 和 %。
對於無法從 Hash index 受益的情境下 (如上述情境),將 Hash index 關閉可以減少不必要的性能開銷。
可以透過 SHOW ENGINE INNODB STATUS 輸出的 SEMAPHORES 來監控 adaptive hash index 的使用和競爭狀況,如果發現有大量線程在等待 btr0sea.c 中的 rw-latches,則應該考慮增加 innodb_adaptive_hash_index_parts 或者關閉 adaptive hash index。
在 SHOW ENGINE INNODB STATUS 中還有 INSERT BUFFER AND ADAPTIVE HASH INDEX 區塊可以用來參考:
在上述例子中可以發現每秒有 233773 的 hash search 遠大於未使用的 65639,並且在 SEMAPHORES 區塊未發現競爭鎖的狀況,因此建議開啟 adaptive hash index。

建議

使用 SHOW ENGINE INNODB STATUS 觀測 adaptive hash index 的相關指標:SEMAPHORES 及 INSERT BUFFER AND ADAPTIVE HASH INDEX 區塊,去做相應的調整。
如果發現 INSERT BUFFER AND ADAPTIVE HASH INDEX 中命中 hash search 很多,但是在 SEMAPHORES 有競爭的話可以考慮增加 innodb_adaptive_hash_index_parts

參考