怎么配置Change Buffer

55次阅读
没有评论

共计 2706 个字符,预计需要花费 7 分钟才能阅读完成。

丸趣 TV 小编给大家分享一下怎么配置 Change Buffer,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

Change Buffer 是一种特殊的数据结构,缓存对二级索引页面的更改并且这些页面不在 Buffer Pool 中。缓存的 changes 可能由 Insert、Delete 和 Update 的结果导致。稍后在页面被其他读取操作加载到 Buffer Pool 的时候合并。

简而言之:Change buffer 的主要目的是将对二级索引的数据操作缓存下来,以此减少二级索引的随机 IO,并达到操作合并的效果。

与聚簇索引 (ps:默认是 InnoDB 里的主键,主键是聚集存储的) 不同,二级索引通常不是唯一的,并且插入二级索引的顺序相对随机。删除和更新可能会影响不在索引树中相邻的二级索引页。当受影响的页面被其他操作读入缓冲池时,合并缓存的更改,避免了从磁盘读取二级索引页到缓冲池所需的大量随机访问 I / O。

在 MySQL5.5 之前的版本中,由于只支持缓存 insert 操作,所以最初叫做 insert buffer,只是后来的版本中支持了更多的操作类型缓存,才改叫 change buffer,所以本文是基于 MySQL5.5 之后的版本。

(Secondary Index(二级索引)

1、也可以称为 非聚集索引

2、叶子节点存储的是索引和主键信息

3、在找到索引后,得到对应的主键,再回到聚集索引 中找主键对应的记录(row data))

放出二级索引的解释可能还是懵,什么时候算作二级索引,所有主键以外的索引都是二级索引(innodb 默认)。

所以说根据主键访问数据(永远是效果最好的方式),原因看上方括号内二级索引介绍

为何需要 Change Buffer

表的索引存于该表的 ibd 文件中,数据也存于此文件。表数据更新的同时也会更新对应的表的索引数据,所以:例如对表进行 insert 时,很可能会产生大量的物理读(物理读索引数据页),insert 一个表,对应的表上面的索引会变动,索引不常使用,产生物理读,索引顺序和表不一致耗时。

(物理读(Physical Reads):从磁盘读取数据块到内存的操作叫物理读,当缓存不存在这些数据块的时候就会产生物理读,物理读过大表现为磁盘 I/O 较高)

所以将对索引的更新记录存入 Change Buffer 中,而不是直接调入索引页进行更新; 选择时机进行 merge insert buffer 的操作,将 insert buffer 中的记录合并 (merge) 到真正的辅助索引中。

系统大部分空闲时或在慢速关闭期间运行的清除 (purge) 操作会定期将更新的索引页写入磁盘。与每个值立即写入磁盘相比,purge 操作可以更有效地为一系列索引值写入磁盘块。

当有许多受影响的行和许多要更新的二级索引时,Change Buffer 合并可能需要几个小时。在此期间,磁盘 I / O 会增加,这会导致磁盘绑定查询显着减慢。在提交事务之后,甚至在服务器关闭并重新启动之后,更改缓冲区合并也可能继续发生

在内存中,Change Buffer 占用 Buffer Pool 的一部分。在磁盘上,Change Buffer 是系统表空间的一部分,其中的索引会在关闭数据库服务器时更改。

配置 Change Buffer

对表执行 INSERT,UPDATE 和 DELETE 操作时,索引列的值 (尤其是 secondary keys 的值) 通常按未排序顺序排列,需要大量 I / O 才能使二级索引更新。Change Buffer 会缓存这个更新当相关页面不在 Buffer Pool 中,从而磁盘上的相关页面不会立即被读避免了昂贵的 I / O 操作。当页面加载到缓冲池中时,将合并缓冲的更改,稍后将更新的页面刷新到磁盘。该 InnoDB 主线程在服务器几乎空闲时以及在慢速关闭期间合并缓冲的更改。

为方便理解:来了一个关于二级索引页面的 DML 操作,并且这个页面没有在 Buffer Pool 内,那么把这个操作存入 Change Buffer(MySQL5.5 之前的版本叫 Insert Buffer),ok,那么下一次需要加载这个页面的时候,也就是这个页面有需求的时候,会将 Change Buffer 内的更改合并到 Buffer Pool,随后当服务器在空闲的时候,这个更改会刷到 disk(磁盘)上。所以一开始那张很难读的图的流程就清晰了:(黄色箭头这样的走势)

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

但是,Change Buffer 占用 Buffer Pool 的一部分,从而减少了可用于缓存数据页的内存。如果工作集几乎适合 Buffer Pool,或者您的表具有相对较少的二级索引,则禁用 Change Buffer 可能很有用。

毕竟 Change Buffer 只适用于 Buffer Pool 外的页面嘛。

可以使用 innodb_change_buffering 配置参数

允许的 innodb_change_buffering 值包括:

all

默认值:所有操作

none

不要缓冲任何操作。

inserts

缓冲插入操作。

deletes

缓冲区删除标记操作。

changes

缓冲插入和删除标记操作。

purges

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

Change Pool 内部结构

ibuf 代表 Insert Buffer,可以直接将其看成 Change Buffer,为 MySQL 5.5 之前 Change Buffer 就叫 Insert Buffer

ibuf btree 最大默认为 buffer pool size 的 25%,当超过 25% 时,可能触发用户线程同步缩减 ibuf btree。为何要将 ibuf btree 的大小和 buffer pool 大小相关联呢 ? 一个比较重要的原因是防止 ibuf 本身占用过多的 buffer pool 资源。

配置 Change Pool 最大大小

该 innodb_change_buffer_max_size 变量允许将 Change Buffer 的最大大小配置为缓冲池总大小的百分比。默认情况下,innodb_change_buffer_max_size 设置为 25. 最大设置为 50。

使用测试不同的设置的业务性能以确定最佳配置。该 innodb_change_buffer_max_size 设置是动态的,允许在不重新启动服务器的情况下修改设置。类似 innodb_buffer_pool_size 也可以在线更改那种。

以上是“怎么配置 Change Buffer”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-17发表,共计2706字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)