InnoDB關鍵特性之自適應hash索引

1、索引的資源消耗分析node

一、索引三大特色mysql

  一、小:只在一個到多個列創建索引sql

  二、有序:能夠快速定位終點spa

  三、有棵樹:能夠定位起點,樹高通常小於等於33d

二、索引的資源消耗點code

  一、樹的高度,順序訪問索引的數據頁,索引就是在列上創建的,數據量很是小,在內存中;blog

  二、數據之間跳着訪問排序

    一、索引往表上跳,可能須要訪問表的數據頁不少;索引

    二、經過索引訪問表,主鍵列和索引的有序度出現嚴重的不一致時,可能就會產生大量物理讀;內存

  資源消耗最厲害:經過索引訪問多行,須要從表中取多行數據,若是無序的話,來回跳着找,跳着訪問,物理讀會很嚴重。

 

2、自適應hash索引原理

一、原理過程

 

  Innodb存儲引擎會監控對錶上二級索引的查找,若是發現某二級索引被頻繁訪問,二級索引成爲熱數據,創建哈希索引能夠帶來速度的提高,則:

  一、自適應hash索引功能被打開

mysql> show variables like '%ap%hash_index'; +----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| innodb_adaptive_hash_index | ON    |
+----------------------------+-------+
1 row in set (0.01 sec)

  二、常常訪問的二級索引數據會自動被生成到hash索引裏面去(最近連續被訪問三次的數據),自適應哈希索引經過緩衝池的B+樹構造而來,所以創建的速度很快。

二、特色

  一、無序,沒有樹高

  二、下降對二級索引樹的頻繁訪問資源

    索引樹高<=4,訪問索引:訪問樹、根節點、葉子節點

  三、自適應

三、缺陷

  一、hash自適應索引會佔用innodb buffer pool;

  二、自適應hash索引只適合搜索等值的查詢,如select * from table where index_col='xxx',而對於其餘查找類型,如範圍查找,是不能使用的;

  三、極端狀況下,自適應hash索引纔有比較大的意義,能夠下降邏輯讀。

 

3、監控與關閉

一、狀態監控

mysql> show engine innodb status\G …… Hash table size 34673, node heap has 0 buffer(s) 0.00 hash searches/s, 0.00 non-hash searches/s

  一、34673:字節爲單位,佔用內存空間總量

  二、經過hash searches、non-hash searches計算自適應hash索引帶來的收益以及付出,肯定是否開啓自適應hash索引

二、限制

  一、只能用於等值比較,例如=, <=>,in

  二、沒法用於排序

  三、有衝突可能

  四、MySQL自動管理,人爲沒法干預。

三、自適應哈希索引的控制

  因爲innodb不支持hash索引,可是在某些狀況下hash索引的效率很高,因而出現了adaptive hash index功能,可是經過上面的狀態監控,能夠計算其收益以及付出,控制該功能開啓與否。

  默認開啓,建議關掉,意義不大。能夠經過 set global innodb_adaptive_hash_index=off/on 關閉和打開該功能。

相關文章
相關標籤/搜索