自适应哈希索引使 InnoDB
能够在具有适当工作负载和足够内存的系统上表现得像内存数据库一样,而不牺牲事务功能或可靠性。自适应哈希索引可以通过 innodb_adaptive_hash_index
变量启用,或者在服务器启动时通过 --skip-innodb-adaptive-hash-index
关闭。
基于观察到的搜索模式,使用索引键的前缀构建哈希索引。前缀可以是任何长度,并且可能只有 B 树中的某些值出现在哈希索引中。哈希索引是在需求时为经常访问的索引页面构建的。
如果表几乎完全适合主内存,哈希索引可以通过直接查找任何元素来加速查询, effectively 将索引值转换为指针。InnoDB
有一个监控索引搜索的机制。如果 InnoDB
注意到查询可以从构建哈希索引中受益,它将自动执行。
对于某些工作负载,哈希索引查找的加速远远超过了监控索引查找和维护哈希索引结构的额外工作。在高负载情况下,例如多个并发连接,访问自适应哈希索引可能会成为争用源。使用 LIKE
运算符和 %
通配符的查询也不会受益。如果工作负载不受益于自适应哈希索引,禁用它可以减少不必要的性能开销。由于很难预先确定自适应哈希索引是否适合特定系统和工作负载,因此请考虑在启用和禁用情况下运行基准测试。
自适应哈希索引功能是分区的。每个索引都绑定到特定的分区,每个分区都受到单独的 latch 的保护。分区由 innodb_adaptive_hash_index_parts
变量控制。 innodb_adaptive_hash_index_parts
变量的默认设置为 8,最大设置为 512。
您可以在 SEMAPHORES
部分的 SHOW ENGINE INNODB STATUS
输出中监控自适应哈希索引的使用和争用。如果有许多线程等待在 btr0sea.c
中创建的 rw-latches,请考虑增加自适应哈希索引的分区数或禁用自适应哈希索引。
有关哈希索引的性能特征,请参阅 第 10.3.9 节,“B 树和哈希索引的比较”。