衆所周知,InnoDB使用的索引結構是B+樹,但其實它還支援另一種索引:自适應哈希索引。
哈希表是數組+連結清單的形式。通過哈希函數計算每個節點資料中鍵所對應的哈希桶位置,如果出現哈希沖突,就使用拉鍊法來解決。更多内容可以參考 百度百科-哈希表
從以上可以知道,哈希表查找最優情況下是查找一次.而InnoDB使用的是B+樹,最優情況下的查找次數根據層數決定。是以為了提高查詢效率,InnoDB便允許使用自适應哈希來提高性能。
可以通過參數 innodb_adaptive_hash_index 來決定是否開啟。預設是打開的。
mysql> show variables like "innodb_adaptive_hash_index";+----------------------------+-------+
| Variable_name | Value |
+----------------------------+-------+
| innodb_adaptive_hash_index | ON |
+----------------------------+-------+
存儲引擎會自動對個索引頁上的查詢進行監控,如果能夠通過使用自适應哈希索引來提高查詢效率,其便會自動建立自适應哈希索引,不需要開發人員或運維人員進行任何設定操作。
自适應哈希索引是對innodb的緩沖池的B+樹頁進行建立,不是對整張表建立,是以速度很快。
可以通過檢視innodb的status來檢視自适應哈希索引的使用情況。
mysql>show engine innodb status \G*************************** 1. row ***************************Type: InnoDB
Name:
Status:=====================================
2019-03-07 23:37:23 0x7f1f2d34c700INNODB MONITOR OUTPUT=====================================Per second averages calculatedfrom the last 6seconds------------------------------------------------------INSERT BUFFER AND ADAPTIVE HASH INDEX-------------------------------------Ibuf: size1, free list len 0, seg size 2, 0merges
merged operations:
insert0, delete mark 0, delete 0discarded operations:
insert0, delete mark 0, delete 0Hash table size34679, node heap has 0buffer(s)
Hash table size34679, node heap has 0buffer(s)
Hash table size34679, node heap has 0buffer(s)
Hash table size34679, node heap has 0buffer(s)
Hash table size34679, node heap has 0buffer(s)
Hash table size34679, node heap has 0buffer(s)
Hash table size34679, node heap has 0buffer(s)
Hash table size34679, node heap has 0buffer(s)0.00 hash searches/s, 0.00 non-hash searches/s-------------------------------END OF INNODB MONITOR OUTPUT============================
可以看到自适應哈希索引大小,每秒的使用情況。
注意從哈希表的特性來看,自适應哈希索引隻能用于等值查詢,範圍或者大小是不允許的。
等着查詢: select * from xx where name = "xxx";