MySQL 配置InnoDB变更缓冲

配置InnoDB变更缓冲
当在表上执行INSERT、UPDATE和DELETE操作时,索引列的值(特别是辅助键的值)通常是无序的,这需要大量的I/O来更新辅助索引。InnoDB有一个更改缓冲区,当相关的辅助索引页面不在缓冲池中时,它将缓存辅助索引的改变,这样就不会立即从磁盘读取页面,从而避免了昂贵的I/O操作。当页面加载到缓冲池时,缓冲的更改将被合并,更新后的页面稍后将刷新到磁盘。InnoDB主线程在服务器几乎空闲的时候,或者在缓慢关闭的时候,合并缓冲的变更。

因为它可以减少磁盘读写,所以更改缓冲区特性对于I/O限制的工作负载最有价值,例如具有大量DML操作(如批量插入)的应用程序。

但是,更改缓冲区占用了缓冲池的一部分,减少了可用来缓存数据页的内存。如果工作集几乎可以放进缓冲池,或者如果表的辅助索引相对较少,那么禁用更改缓冲可能会很有用。如果工作集完全适合缓冲区,那么更改缓冲区不会带来额外的开销,因为它只应用于不在缓冲池中的页。

你可以使用innodb_change_buffering配置参数来控制InnoDB执行改变缓冲的程度。您可以为插入、删除操作(当索引记录最初被标记为删除时)和清除操作(当索引记录被物理删除时)启用或禁用缓冲。更新操作是插入操作和删除操作的组合。innodb_change_buffer的默认值为all。

允许的innodb_change_buffer值包括如下所示:
.all
默认值:缓冲区插入、删除标记操作和清除操作

.none
不缓冲任何操作

.inserts
缓冲插入操作。

.deletes
缓冲delete-marking操作

.changes
缓冲插入和删除标记操作

.purges
缓冲发生在后台的物理删除操作

你可以在MySQL选项文件(my.cnf或my.ini)中设置innodb_change_buffer参数,或者使用set GLOBAL命令动态修改,这需要超级权限。更改设置会影响新操作的缓冲;现有缓冲项的合并不会受到影响。

配置更改缓冲区的最大大小
从MySQL5.6.2开始,innodb_change_buffer_max_size配置选项允许你配置变更缓冲区的最大大小占缓冲池总大小的百分比。默认情况下,innodb_change_buffer_max_size设置为25。最大值为50。

你可以考虑在MySQL服务器上增加innodb_change_buffer_max_size,增加大量的插入、更新和删除活动,其中更改缓冲区的合并跟不上新的更改缓冲区条目,导致更改缓冲区达到其最大大小限制。

用典型的工作负载测试不同的设置,以确定最佳配置。innodb_change_buffer_max_size设置是动态的,允许您在不重启服务器的情况下修改该设置

发表评论

电子邮件地址不会被公开。