Inno内存结构之自适应哈希索引与日志缓冲区
自适应哈希索引功能可以InnoDB
在不牺牲事务功能或可靠性的情况下,在工作负载和缓冲池有足够内存的适当组合的系统上,更像是内存数据库。自适应哈希索引功能由innodb_adaptive_hash_index
变量启用 ,或在服务器启动时由禁用 --skip-innodb-adaptive-hash-index
。
根据观察到的搜索模式,使用索引关键字的前缀构建哈希索引。该前缀可以是任何长度,并且可能是哈希树索引中仅B树中的某些值出现。哈希索引是根据对经常访问的索引页面的需求而建立的。
如果表几乎完全适合主内存,则散列索引可以通过启用直接查找任何元素的功能来加速查询,从而将索引值转换为某种指针。InnoDB
具有监视索引搜索的机制。如果 InnoDB
注意到查询可以从构建哈希索引中受益,它会自动这样做。
在某些工作负载下,哈希索引查找的速度大大超过了监视索引查找和维护哈希索引结构的额外工作。在繁重的工作负载(例如多个并发连接)下,访问自适应哈希索引有时可能会成为争用的源。与 LIKE
运算符和%
通配符也往往不会受益。对于无法从自适应哈希索引功能中受益的工作负载,将其关闭可减少不必要的性能开销。由于很难预先预测自适应哈希索引功能是否适合特定的系统和工作负载,因此请考虑启用和禁用该功能时运行基准测试。与早期版本相比,MySQL 5.6中的体系结构更改使它更适合禁用自适应哈希索引功能。
在MySQL 5.7中,自适应哈希索引功能已分区。每个索引都绑定到一个特定的分区,并且每个分区都受到单独的锁存器的保护。分区由innodb_adaptive_hash_index_parts
变量控制 。在较早的版本中,自适应哈希索引功能受单个闩锁的保护,这可能成为繁重工作负载下的争用点。该 innodb_adaptive_hash_index_parts
变量默认设置为8。最大设置为512。
您可以在输出SEMAPHORES
部分中 监视自适应哈希索引的使用和争用 SHOW ENGINE INNODB STATUS
。如果在中创建的RW锁上有许多线程在等待btr0sea.c
,请考虑增加自适应哈希索引分区的数量或禁用自适应哈希索引功能。
有关哈希索引的性能特征的信息,请参见“ B树和哈希索引的比较”。
日志缓冲区
日志缓冲区是存储区域,用于保存要写入磁盘上的日志文件的数据。日志缓冲区大小由innodb_log_buffer_size
变量定义 。默认大小为16MB。日志缓冲区的内容定期刷新到磁盘。较大的日志缓冲区使大型事务可以运行,而无需在事务提交之前将重做日志数据写入磁盘。因此,如果您有更新,插入或删除许多行的事务,则增加日志缓冲区的大小可以节省磁盘I / O。
该 innodb_flush_log_at_trx_commit
变量控制如何将日志缓冲区的内容写入并刷新到磁盘。该 innodb_flush_log_at_timeout
变量控制日志刷新频率。
有关相关信息,请参阅“ 内存配置 ”和 “优化InnoDB重做日志”。
更多内容欢迎关注我的个人公众号“韩哥有话说”,100G人工智能学习资料,大量后端学习资料等你来拿。