自适应哈希索引启用InnoDB
在具有适当组合的工作负载和足够的缓冲池内存的系统上执行更像内存中的数据库,而不牺牲事务特性或可靠性。属性启用自适应哈希索引innodb_adaptive_hash_index
变量,或在服务器启动时关闭——skip-innodb-adaptive-hash-index
.
根据观察到的搜索模式,使用索引键的前缀构建散列索引。前缀可以是任意长度,而且可能只有b树中的一些值出现在哈希索引中。哈希索引是根据经常访问的索引页的需求构建的。
如果一个表几乎完全装在主存中,哈希索引通过支持对任何元素的直接查找,将索引值转换为一种指针,从而加快查询速度。InnoDB
具有监视索引搜索的机制。如果InnoDB
注意,查询可以从构建散列索引中受益,它会自动这样做。
在某些工作负载下,哈希索引查找带来的加速远远超过监视索引查找和维护哈希索引结构的额外工作。对自适应哈希索引的访问有时会成为高工作负载(例如多个并发连接)下的争用源。查询与就像
运营商和%
通配符通常也不会受益。对于不能从自适应哈希索引获益的工作负载,关闭它可以减少不必要的性能开销。因为很难预先预测自适应哈希索引特性是否适合特定的系统和工作负载,所以可以考虑在启用和禁用该特性的情况下运行基准测试。
在MySQL 5.7中,自适应哈希索引特性是分区的。每个索引都绑定到一个特定的分区,每个分区都由一个单独的锁存器保护。控件控制分区innodb_adaptive_hash_index_parts
变量。在早期版本中,自适应哈希索引特性由单个锁存器保护,该锁存器在高工作负载下可能成为争用点。的innodb_adaptive_hash_index_parts
变量默认设置为8。最大可设置为512。
中的自适应哈希索引使用和争用信号量
的部分显示引擎innodb状态
输出。中创建的rw-latch上有许多线程在等待btr0sea.c
,考虑增加自适应哈希索引分区的数量或禁用自适应哈希索引。
有关哈希索引的性能特征的信息,请参见第8.3.8节“b -树和哈希索引的比较”.