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