InnoDB儲存引擎——自適應雜湊索引

readyao發表於2017-03-14

雜湊(hash)是一種非常快的查詢方法,在一般情況下這種查詢的時間複雜度為O(1),即一般僅需要一次查詢就能定位資料。
而B+樹的查詢次數,取決於B+樹的高度,在生產環境中,B+樹的高度一般為3~4層,所以需要3~4次的查詢。

InnoDB儲存引擎會監控對錶上各索引頁的查詢。如果觀察到建立雜湊索引可以帶來速度提升,則建立雜湊索引,稱之為自適應雜湊索引(Adaptive Hash Index, AHI)。AHI是通過緩衝池的B+樹頁構造而來,因此建立的速度很快,而且不需要對整張表構建雜湊索引。InnoDB儲存引擎會自動根據訪問的頻率和模式來自動地為某些熱點頁建立雜湊索引。

AHI有一個要求,對這個頁的連續訪問模式必須是一樣的。例如對於(a,b)這樣的聯合索引頁,其訪問模式可以是下面情況:
1)where a=xxx
2)where a =xxx and b=xxx
訪問模式一樣是指查詢的條件是一樣的,若交替進行上述兩種查詢,那麼InnoDB儲存引擎不會對該頁構造AHI。
AHI還有下面幾個要求:
1)以該模式訪問了100次
2)頁通過該模式訪問了N次,其中N=頁中記錄*1/16

InnoDB儲存引擎官方文件顯示,啟用AHI後,讀取和寫入速度可以提高2倍,輔助索引的連線操作效能可以提高5倍。AHI的設計思想是資料庫自優化,不需要DBA對資料庫進行手動調整。

mysql> show engine innodb status\G

下面是部分輸出:

-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
merged operations:
 insert 0, delete mark 0, delete 0
discarded operations:
 insert 0, delete mark 0, delete 0
Hash table size 276671, node heap has 0 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s

可以看到AHI的使用資訊,包括AHI的大小,使用情況,每秒使用AHI搜尋的情況。
雜湊索引只能用來搜尋等值的查詢,如select * from table where index_col=’xxx’;
對於其它型別的查詢,比如範圍查詢,是不能使用雜湊索引的,因此這裡出現了non-hash searches/s的情況。通過hash searches/s和non-hash searches/s可以大概瞭解使用雜湊索引後的效率。

可以通過引數innodb_adaptive_hash_index來考慮禁用或啟動此特性,預設是開啟狀態。

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

相關文章