14.5.3 自适应哈希索引

自适应哈希索引功能使InnoDB能够在具有适当的工作负载和足够的缓冲池内存的系统上,像内存数据库一样执行操作,而不会牺牲事务功能或可靠性。自适应哈希索引功能由innodb_adaptive_hash_index变量启用,或在服务器启动时由--skip-innodb-adaptive-hash-index禁用。

根据观察到的搜索模式,使用索引关键字的前缀构建哈希索引。该前缀可以是任何长度,并且可能是哈希树索引中仅 B 树中的某些值出现。哈希索引是根据对经常访问的索引页面的需求而构建的。

如果 table 几乎完全适合主内存,则散列索引可以通过启用直接查找任何元素的功能来加速查询,从而将索引值转换为某种指针。 InnoDB具有监视索引搜索的机制。如果InnoDB注意到查询可以从构建哈希索引中受益,则它会自动这样做。

在某些工作负载下,哈希索引查找的速度大大超过了监视索引查找和维护哈希索引结构的额外工作。在繁重的工作负载(例如多个并发连接)下,访问自适应哈希索引有时可能会成为争用的源。使用LIKE运算符和%通配符的查询也往往不会受益。对于无法从自适应哈希索引功能中受益的工作负载,将其关闭可减少不必要的性能开销。由于很难预先预测自适应哈希索引功能是否适合特定的系统和工作负载,因此请考虑启用和禁用该功能时运行基准测试。与早期版本相比,MySQL 5.6 中的体系结构更改使它更适合禁用自适应哈希索引功能。

在 MySQL 5.7 中,自适应哈希索引功能已分区。每个索引都绑定到一个特定的分区,并且每个分区都受到单独的锁存器的保护。分区由innodb_adaptive_hash_index_parts变量控制。在较早的版本中,自适应哈希索引功能受单个闩锁的保护,这可能成为繁重工作负载下的争用点。默认情况下,innodb_adaptive_hash_index_parts变量设置为 8.最大设置为 512.

您可以在显示引擎的 INNODB 状态输出的SEMAPHORES部分中监视自适应哈希索引的使用和争用。如果有大量线程在btr0sea.c中创建的 RW 锁上 await,请考虑增加自适应哈希索引分区的数量或禁用自适应哈希索引功能。

有关哈希索引的性能 Feature 的信息,请参见第 8.3.8 节“ B 树和哈希索引的比较”