MySQL关于change buffer的疑问

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL关于change buffer的疑问相关的知识,希望对你有一定的参考价值。

什么是merge

将 change buffer 中的操作应用到原数据页,得到最新结果的过程称为 merge。除了访问这个数据页会触发 merge 外,系统有后台线程会定期 merge。 在数据库正常关闭(shutdown)的过程中,也会执行 merge 操作。


为什么change buffer适用于普通索引

唯一索引的更新就不能使用 change buffer,实际上也只有普通索引可以使用。对于唯一索引来说,需要将数据页读入内存,判断到没有冲突,插入这个值,语句执行结束;

将数据从磁盘读入内存涉及随机 IO 的访问,是数据库里面成本最高的操作之一。 change buffer 因为减少了随机磁盘访问,所以对更新性能的提升是会很明显的。


change buffer适用什么场景

对于写多读少的业务来说,页面在写完以后马上被访问到的概率比较小,此时 change buffer 的使用效果最好。 这种业务模型常见的就是账单类、日志类的系统。 如果所有的更新后面,都马上伴随着对这个记录的查询,那么你应该关闭 change buffer。 而在其他情况下,change buffer 都能提升更新性能。


和redo的区别

redo log 主要节省的是随机写磁盘的 IO 消耗(转成顺序写), 而 change buffer 主要节省的则是随机读磁盘的 IO 消耗。


merge 的执行流程是什么样的

从磁盘读入数据页到内存(老版本的数据页); 从 change buffer 里找出这个数据页的 change buffer 记录 (可能有多个),依次应用,得到新版数据页; 写 redo log。这个 redo log 包含了数据的变更和 change buffer 的变更。 到这里 merge 过程就结束了。这时候,数据页和内存中 change buffer 对应的磁盘位置都还没有修改,属于脏页,之后各自刷回自己的物理数据,就是另外一个过程了。



以上是关于MySQL关于change buffer的疑问的主要内容,如果未能解决你的问题,请参考以下文章

MySQL之change buffer和buffer pool

MySql 缓冲池(buffer pool) 和 写缓存(change buffer) 转

面试官:来来来!聊聊MySQL数据库的insert buffer和change buffer吧

MySQL学习change-buffer

MySQL Index--Change Buffer

MySQL写缓冲(change buffer),终于懂了!!!(收藏)