MySQL changebuffer是什么,有什么作用

我们来看一下官网的一张图:

图片[1]-MySQL changebuffer是什么,有什么作用-编程社

从上面的图我们可以看到, buffer pool 里面其实有一块内存是留给 change buffer 用的。

1、那 change buffer 具体是个什么东西呢?

假设我们就直接执行一条 update table set name = 'yes' where id = 1,如果此时 buffer pool 里没有 id 为 1 的这条数据,那怎么办?

难道把这条数据先加载到 buffer pool 中,然后再执行修改吗?

当然不是,这时候 change buffer 就上场了。

如果当前数据页不在 buffer pool 中,那么 innodb 会把更新操作缓存到 change buffer 中,当下次访问到这条数据后,会把数据页加载到 buffer pool 中,并且应用上 change buffer 里面的变更,这样就保证了数据的一致性。

2、所以 change buffer 有什么好处?

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

看到我加粗的字体没,二级索引页,没错 change buffer 只能用于二级索引的更改,不适用于主键索引,空间索引以及全文索引

还有,唯一索引也不行,因为唯一索引需要读取数据然后检查数据的一致性。

3、看到这肯定又有小伙伴关心:更改先缓存在 change buffer 中,假如数据库挂了,更改不是丢了吗?

别怕,change buffer 也是要落盘存储的,从上图我们看到 change buffer 会落盘到系统表空间里面,然后 redo log 也会记录 chang buffer 的修改来保证数据一致性。

至此,想必你对 change buffer 已经有一定了解了吧。它主要用来避免于二级索引页修改产生的随机I/O

如果你的内存够大能装下所有数据,或者二级索引很少,或者你的磁盘是固态的对随机访问影响不大,其实可以关闭 change buffer,因为它也增加了复杂度,当然最终还是得看压测结果。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称

    暂无评论内容