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 分片:

  1. -------------------------------------
  2. INSERT BUFFER AND ADAPTIVE HASH INDEX
  3. -------------------------------------
  4. Ibuf: size 1, free list len 0, seg size 2, 0 merges
  5. merged operations:
  6. insert 0, delete mark 0, delete 0
  7. discarded operations:
  8. insert 0, delete mark 0, delete 0
  9. Hash table size 34679, node heap has 0 buffer(s)
  10. Hash table size 34679, node heap has 0 buffer(s)
  11. Hash table size 34679, node heap has 0 buffer(s)
  12. Hash table size 34679, node heap has 0 buffer(s)
  13. Hash table size 34679, node heap has 0 buffer(s)
  14. Hash table size 34679, node heap has 0 buffer(s)
  15. Hash table size 34679, node heap has 2 buffer(s)
  16. Hash table size 34679, node heap has 4 buffer(s)
  17. 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 来源:殷建卫 - 架构笔记 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。