Adaptive Hash Index(自适应 Hash 索引)
哈希算法是一种非常快的查找方法,在一般情况(没有发生 Hash 冲突)下这种查找的时间复杂度为 O (1)。
**
InnoDB 存储引擎会监控对表上索引页的查询,如果观察到建立 Hash 索引可以提升性能,就会自动在缓冲池建立 Hash 索引,称之为自适应哈希索引。
B+Tree 索引与 Hash 索引:
B+Tree 索引只能找到这条记录所在的页,不能直接找到具体的记录,而 Hash 索引可以直接找到具体的记录。
Hash 索引只支持等值查询,模糊查询、范围查询等是不能使用 Hash 索引的。
B+Tree Index |
Adaptive Hash Index |
|
---|---|---|
查询时间复杂度 | O (树的高度) |
O (1) |
是否持久化 | 是,并通过日志保证完整性 | 否,仅在内存 |
索引对象 | 页 | 热点页所在的记录 |
MySQL 5.6 版本后,官方不再推荐使用自适应 Hash 索引,因为引入 Hash 索引后,CPU 使用率变高,但是性能却没有提升。通过设置参数 innodb_adaptive_hash_index=OFF
可以关闭自适应 Hash 索引。
MySQL 5.7 版本,新增参数 innodb_adaptive_hash_index_parts
,可以把 Adaptive Hash Index 分片,以此来减少查询竞争。
通过 show engine innodb status
命令可以看到有多个 Hash Table 分片:
-------------------------------------
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 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 0 buffer(s)
Hash table size 34679, node heap has 2 buffer(s)
Hash table size 34679, node heap has 4 buffer(s)
0.00 hash searches/s, 0.00 non-hash searches/s
Flush Neighbor Page(FNP)
InnoDB 存储引擎还提供了 Flush Neighbor Page(刷新邻接页)的特性。其工作原理为:当刷新一个脏页时,InnoDB 存储引擎会检测该页所在区(Extent)的所有脏页,合并 I/O,进行刷新。
InnoDB 提供了参数 innodb_flush_neighbors={0|1|2}
用来控制是否启用该特性,该参数有三个值:
- 0:表示关闭该功能。
- 1:表示刷新一个区内的脏页。
- 2:表示刷新几个连续的脏页。
对于传统机械硬盘建议启用该特性,可以设置为 2,而对于固态硬盘(SSD)有着较高的 IOPS 性能的磁盘,则建议将该参数设置为 0,即关闭该特性。
作者:殷建卫 链接:https://www.yuque.com/yinjianwei/vyrvkf/am64s6 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。