17.5.3 自适应哈希索引
自适应哈希索引能让InnoDB在具有合适工作负载组合且缓冲池有足够内存的系统上,更像一个内存数据库那样运行,同时又不牺牲事务特性或可靠性。自适应哈希索引由innodb_adaptive_hash_index
变量启用,也可以在服务器启动时通过--skip-innodb-adaptive-hash-index
选项将其禁用。
基于观察到的搜索模式,InnoDB会使用索引键的前缀构建哈希索引。该前缀可以是任意长度,并且B树中的某些值可能只会出现在哈希索引中。哈希索引是根据对频繁访问的索引页的需求来构建的。
如果一个表几乎完全能存于主内存中,哈希索引可以通过直接查找任何元素来加快查询速度,将索引值变成一种指针。InnoDB有一种机制可以监控索引搜索。如果InnoDB发现构建哈希索引能让查询受益,它会自动进行构建。
在某些工作负载下,哈希索引查找带来的速度提升,远远超过监控索引查找和维护哈希索引结构所需的额外工作。在高负载情况下,例如多个并发连接,对自适应哈希索引的访问有时会成为争用的源头。带有LIKE
操作符和%
通配符的查询往往也无法从中受益。对于那些无法从自适应哈希索引中获益的工作负载,将其禁用可以减少不必要的性能开销。由于很难预先判断自适应哈希索引是否适用于特定的系统和工作负载,建议分别在启用和禁用该功能的情况下进行基准测试。
自适应哈希索引功能是分区的。每个索引都绑定到一个特定的分区,并且每个分区都由一个单独的闩锁保护。分区由innodb_adaptive_hash_index_parts
变量控制。innodb_adaptive_hash_index_parts
变量的默认值为8,最大值为512。
可以在SHOW ENGINE INNODB STATUS
输出的SEMAPHORES
部分监控自适应哈希索引的使用情况和争用情况。如果有大量线程在等待btr0sea.c
中创建的读写闩锁,可以考虑增加自适应哈希索引分区的数量,或者禁用自适应哈希索引。
有关哈希索引性能特点的信息,请参见10.3.9节 “B树索引和哈希索引的比较”。
17.5.4 日志缓冲区
日志缓冲区是用于存储即将写入磁盘日志文件数据的内存区域。日志缓冲区的大小由innodb_log_buffer_size
变量定义,默认大小为16MB。日志缓冲区的内容会定期刷新到磁盘。较大的日志缓冲区可以支持大型事务运行,使其在提交前无需将重做日志数据写入磁盘。因此,如果事务涉及大量行的更新、插入或删除操作,增加日志缓冲区的大小可以减少磁盘I/O。
innodb_flush_log_at_trx_commit
变量控制日志缓冲区内容写入和刷新到磁盘的方式。innodb_flush_log_at_timeout
变量则控制日志刷新的频率。