如果系统有充足的内存提供给Buffer Pool,在特定系统负载条件下,使用自适应哈希索引可以使InnoDB表现的
像内存数据库一样,且不会牺牲事务特性和可靠性。自适应哈希索引可以通过变量innodb_adaptive_hash_index
来开启,也可以在MySQL启动时通过--skip-innodb-adaptive-hash-index来关闭。哈希索引使用索引键值
前缀来构建索引,基于观察到的搜索模式。前缀可以是任意长度,而且可能只有B+树中的部分值出现在哈希索引中。
哈希索引是为经常访问的索引页面构建的。
如果一张表几乎所有数据都在主内存中,哈希索引可以快速查找元素,将索引值转换为某种指针,从而加速查询。
InnoDB有监控索引搜索的机制。如果InnoDB通过观察,判断可以通过构建哈希索引来加速查询,就会自动构建
哈希索引。
在特定工作负载下,哈希索引加速查询带来的好处,超过了监控索引查找及维护哈希索引带来的开销。在高负载
场景下,访问自适应哈希索引有时可能会成为争论源,比如大量并发join时(以下翻译可能更合适:在高负载场
景下,访问自适应哈希索引带来的好处可能会下降)。带like和%通配符的查询也可能不会从自适应哈希索引中
受益。如果工作负载不能从自适应哈希索引中受益,那么关闭它可能会减少不必要的性能开销。由于难以提前预
测自适应哈希索引是否适合特定系统和特定负载,应该考虑分别在开启和关闭条件下进行性能测试。
自适应哈希索引是分段的。每个索引都被绑定到一个特定的分段上,每一个分段都受一个独立的latch的保护。分
段的数量由innodb_adaptive_hash_index_parts变量控制。默认值是8,最大值是512.
我们可以通过SHOW ENGINE INNODB STATUS输出的SEMAPHORES部分来观察自适应哈希索引的使用情况。如果
有多个线程在等待btr0sea.c创建的rw-latches锁,应该考虑增加自适应哈希索引的分区数量,或者是关闭自适
应哈希索引。想了解更多的关于哈希索引的性能特征信息,查看 8.3.9章, ”Comparison of B-Tree and Hash Indexes”。
自适应哈希索引