mysql8 翻译系列 六十九

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变量则控制日志刷新的频率。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容