【MySQL进阶】什么是自适应哈希索引?
自适应哈希索引又是一个比较有趣的技术点,这种技术可以算的上是一种AI
技术,哈希算法查找数据的效率非常高,在没有哈希冲突的情况下复杂度为O(1)
,而B+Tree
检索数据的效率,取决于树的高度。建立索引时,只能选用一种数据结构来作为索引的底层结构:
- 如果选择哈希结构,虽然效率高,但数据是无序的,因此不方便做排序查询。
- 如果选择
B+Tree
结构,虽然有序,但查询的效率会受到树高的影响。
此时似乎陷入了两难的地步,两种结构各有优劣,但一般为了满足业务按序查询的需求,所以会折中选择B+Tree
结构,虽然没有哈希索引那么快,但速度也还可以。
分析上述这个场景,明明选哈希结构的效率特别惊人,但就是不能用,这就好比你面前有一道绝世佳肴,但就不能吃一样,这显然令人十分难受。
而正是由于此原因,InnoDB
创始人在研发时,就实现了一种名为自适应哈希索引的技术,在MySQL
运行过程中,InnoDB
引擎会对表上的索引做监控,如果某些数据经常走索引查询,那InnoDB
就会为其建立一个哈希索引,以此来提升数据检索的效率,并且减少走B+Tree
带来的开销,由于这种哈希索引是运行过程中,InnoDB
根据B+Tree
的索引查询次数来建立的,因此被称之为自适应哈希索引。
自适应哈希索引和普通哈希索引的区别在哪儿呢?普通哈希索引是在创建索引时将结构声明为
Hash
结构,这种索引会以索引字段的整表数据建立哈希,而自适应哈希索引是根据缓冲池的B+
树构造而来,只会基于热点数据构建,因此建立的速度会非常快,毕竟无需对整表都建立哈希索引。
自适应哈希索引在InnoDB
中是默认开启的,可以通过手动调整innodb_adaptive_hash_index
参数来控制关闭,但一般尽量不要去关闭它,因为该技术能让MySQL
的整体性能翻倍。
在
MySQL8.0
以下的版本中,如果同时删除一张大表的很多数据,有可能会因为自适应哈希索引的原因,造成线上MySQL
出现抖动,不过该问题在MySQL8.x
版本中已经被修复,但如若你的MySQL
版本在此之下,那尽量不要在业务高峰期删除大量数据。
对于自适应哈希索引的使用情况,可以通过show engine innodb status \G;
命令查看,但哈希索引由于自身特性的原因,因此也仅只能用于等值查询的场景,无法支持排序、范围查询。