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