三、Adaptive Hash Index(自适应哈希索引)

1)功能

不牺牲事务特性或可靠性的基础上,让 InnoDB 能够在有适当的工作负载组合和足够的缓冲池内存情况下,像操作内存数据库一样进行操作

2)引入目的

  • 随着 MySQL 单表数据量增大,(尽管 B+ 树算法极好地控制了树的层数)索引 B+ 树的层数会逐渐增多;
  • 随着索引树层数增多,检索某一个数据页需要沿着 B+ 树从上往下逐层定位,时间成本就会上升;
  • 为解决检索成本问题,MySQL 就想到使用某一种缓存结构:根据某个检索条件,直接查询到对应的数据页,跳过逐层定位的步骤

3)分区

自适应哈希索引是分区的,每一个索引都与一个特定分区绑定在一起,而且每个分区被一个独立的锁存器保护。
分区是由 innodb_adaptive_hash_index_parts 变量控制的,它的默认值是8,最大值是 512

如果有大量的线程等待获取 btr0sea.c中创建的 rw-latches,考虑关闭这个功能或者将这个变量的值调大
哈希表不能太大(哈希表维护本身就有成本,哈希表太大则成本会高于收益),又不能太小(太小则缓存命中率太低,没有任何收益)

4)使用方式

  • 打开方式:通过设置 innodb_adaptive_hash_index 变量来启用它
  • 关闭方式:通过在服务器启动时添加 --skip-innodbadaptive-hash-index来关闭它

5)构建方式

使用索引键的前缀来构建的。前缀长度任意,可以是B-tree索引树中的某些值。哈希索引是根据被经常访问的索引数据页来构建的

6)何时使用

由于很难预料到这个特性对指定系统或负载是否起作用,可以通过运行基准测试来判定要不要启用这个特性

7)监控方式

SHOW ENGINE INNODB STATUS输出结果中的 SEMAPHORES部分可以查看

8)使用说明

对于那些用不到这个特性的工作负载来说,可以将该功能关闭,从而减少不必要的性能损耗

参考资料

名称 参考链接 参考书籍
Adaptive Hash Index 是如何建立的 https://zhuanlan.zhihu.com/p/106941474