15.5.3 自动哈希索引

原文地址:https://dev.mysql.com/doc/refman/8.0/en/innodb-adaptive-hash.html

在负载和足够buffer pool使用内存恰当的组合的系统之上,自适应哈希索引特性能够让InnoDB表现的更像是一个内存数据库,并且这个特性没有牺牲事务特性和系统的可靠性。可以用innodb_adaptive_hash_index变量来开启自适应哈希索引特性,或者在启动服务器时加参数--skip-innodb_adaptive_hash_index来关闭该特性。

基于观察到的搜索模式,哈希索引使用索引key的前缀来建立。这个前缀可以是任意长度,并且可能B-tree中仅仅某些值会出现在哈希索引中。哈希索引是为了频繁访问的索引页所建立的。

如果一张表数据基本都在内存中,哈希索引能够通过直接查找任何元素来加快查询,把索引值转成一种类似于指针的结构。InnoDB有一套监控索引搜索的机制。如果InnoDB观察到建立一个哈希索引能够加快查询的话,它会自动创建哈希索引。

在某些工作负载下,哈希索引加速的带来的优点大大超过了监控索引查询和维护哈希索引所增加额外负担。在高负载下访问哈希索引有时会成为竞争的罪魁祸首,例如并发的join操作。使用LIKE并且使用%通配符的查询往往毫无用处。对于无法从哈希索引收益的环境下,关闭此功能以减少不必要的开销,可以考虑使用基准测试来决定开启还是关闭哈希索引功能。MySQL5.6架构的改变使得它比早期版本更适合关闭自动哈希索引。

哈希索引是分区的。每个哈希索引和特定的分区绑定,并且每一个分区被独立的阀门保护。分区被innodb_adaptive_hash_index_parts变量控制,innodb_adaptive_hash_index_parts默认值是8,最大值是512。

你可以用SHOW ENGINE INNODB STATUS语句的输出来监控自动哈希索引的使用和竞争。如果有多个线程等待在btr0sea.c中创建的读写锁。考虑增加大批的哈希索引分区或者禁用自动哈希索引特征。

更多哈希索引性能特征的详细信息请查阅第8.3.9 比较B-Tree和哈希索引