InnoDB存儲引擎——自適應哈希索引

哈希(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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章