MySQL的 Change Buffer 是什么? 它有什么用?

Change Buffer 是 MySQL InnoDB 存储引擎中的一个机制, 用于暂存对二级索引的插入和更新操作的变更。而不立即执行这些操作,随后,当 InnoDB 进行合适条件的时候(如页被读取或Flush操作), 会将这些变更写入到二级缓存中。

作用:

提高写入性能:通过二级索引的变更暂存,可以减少对磁盘的频繁写入,提升插入更新操作的性能。

批量处理:Change Buffer 可以再后续的操作中批量处理这些变更,减少了随机写入的开销

 从图中我们可以知道 Buffer Pool 里面有一块内存是留给 change buffer 的

进一步理解 Change Buffer

(1)change buffer 具体是个什么东西?

假如当前表针对 name 有一个二级缓存。假设我们执行一条 update table set name = "laowang" where id = 1,此时的 buffer pool并没有对应二级索引的索引页数据

这个时候就需要把这个索引页加载到内存中立即修改吗?

答案不是的,这个时候 change buffer 就上场了。

如果当前二级索引页不存在 buffer pool 中,那么 innodb 会把更新操作缓存到 change buffer 中,当下次访问到这条数据后,会把索引页加载到 buffer pool 中,并且应用上 change buffer 里面的变更,这样就保证了数据的一致性。(上述SQL中, change buffer 会存储 name 字段的旧索引值删除操作和新索引值的插入操作)

(2)所以change buffer 有什么用处

二级索引页不在 buffer pool 中时,change buffer 可以避免立即从磁盘读取对应索引页导致昂贵的随机 I/O ,对应的更改可以在后面的二级索引页读入 buffer pool 时候被批量应用。

注意:change buffer 只能用于二级索引的更改,不适合于主键索引,空间索引以及全文索引和唯一索引(因为唯一索引需要读取数据然后检查数据的一致性)

(3)先更新缓存在 change buffer 中,加入数据库挂了,更改不是丢了吗?

哈哈哈,那这个 duck 不必担心了。change buffer 也是要落盘存储的,从那个图里面就可以看到 change buffer 会落盘到系统表空间里面的,然后 redo log 也会记录 change buffer 的修改来保证数据的一致性。

自此,我们都对 change buffer 有了一个理解, 他主要是用来避免二级索引页修改产生的随机 I/O。如果你的内存够大能够装下所有的数据,或者二级索引很少的话,或者你的磁盘是固态的对随机访问影响不大的话,其实也可以关闭 change buffer ,因为它也是增加了复杂度,当然最终还是得看压测结果。

Change Buffer 的大小

Change Buffer 的大小可以通过系统变量 innodb_change_buffer_max_size 进行配置,默认值是 25%的 InnoDB 缓冲池大小,最大值可以设置为 50%。合理配置提升性能,大太大可能导致内存不足

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值