三、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