官方文檔:
If a table fits almost entirely in main memory, a hash index can speed up queries by enabling direct lookup of any element, turning the index value into a sort of pointer. has a mechanism that monitors index searches. If notices that queries could benefit from building a hash index, it does so automatically.
翻譯:
如果一個表幾乎完全適合主內存,那么哈希索引可以通過直接查找任何元素來加快查詢速度,將索引值轉換為某種指針。具有監(jiān)視索引搜索的機制。如果注意到查詢可以從構建哈希索引中獲益,那么它會自動這樣做。
官方文檔給出的內容非常含糊,并沒有說明自適應哈希索引的創(chuàng)建條件,只是說自適應哈希索引會自動創(chuàng)建,沒有細節(jié)。我從網上找到了一些資料雖然說的很詳細,但是說的有點過于詳細不能一目了然,所以我重新整理下。
自適應hash創(chuàng)建的條件:
自適應hash索引(AHI)在實現上就是一個哈希表:從某個檢索條件到某個數據頁的哈希表,仿佛并不復雜,但其中的關竅在于哈希表不能太大(哈希表維護本身就有成本,哈希表太大則成本會高于收益),又不能太小(太小則緩存命中率太低,沒有任何收益)。所以在創(chuàng)建AHI上還是有一些講究的。
索引被查詢的次數足夠多。如果查詢次數用N1來表示的話那么N1應該大于17
(N1>17),此過程無時間限制。-
基于查詢的sql語句創(chuàng)建一個hash信息(hash info)其中包含了三部分內容:
1)匹配索引的列數
2)下一列匹配的字節(jié)數
3)是否從左匹配
例如有如下SQL語句:
select * from table1 where a1=1 and a2=2;則生成如下哈希描述:
hash info(2, 0, true)如果這個生成的hash info被使用的次數足夠多
(N2 > 100) 生成的hash info能夠命中某個數據頁,且命中的該頁上的記錄數要大于該頁上總記錄數的1/16
(N3 > 頁記錄數的1/16)
滿足以上三點要求那么就會將hash info生成一個key,value就是指向數據頁上記錄的指針。
這樣就建立起了mysql的自適應哈希索引
參考資料:
http://mysql.taobao.org/monthly/2015/09/01/
https://mp.weixin.qq.com/s/bj6Qe98lWlrd4Hv5B0sn9w