转载:https://blog.csdn.net/weixin_63769882/article/details/129782781
change buffer 的使用场景
change buffer 和 redo log 的区别
参考资料
更新过程
在 MySQL 中,更新的过程要涉及到 change buffer。
当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InooDB 会将这些更新操作缓存在 change buffer 中,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行 change buffer 中与这个页有关的操作。通过这种方式就能保证这个数据逻辑的正确性。
注意 change buffer 是可以持久化的数据。即 change buffer在内存中有拷贝,也会被写入到磁盘上。
将 change buffer 中的操作应用到原数据页,得到最新结果的过程称为 merge。除了访问这个数据页会触发merge外,系统有后台线程会定期merge。在数据库正常关闭的过程中,也会执行 merge 操作。
所以,如果能够将更新操作先记录在 change buffer,减少读磁盘,语句的执行速度会得到明显的提升。而且,数据读入内存是需要占用 buffer pool 的,所以这种方式还能够避免占用内存,提高内存利用率。
注意,change buffer 用的是 buffer pool 里的内存,因此不能无限增大。
什么条件下可以使用 change buffer
这个条件跟索引有关,索引可以分为唯一索引和普通索引。
对于唯一索引来说,所有的更新操作都要先判断这个操作是否违反唯一性约束。比如,要插入一条记录,就要先判断现在表中是否已经存在这条记录,而这必须要将数据页读入内存才能判断。如果都已经读入到内存了,那直接更新内存会更快,就没必要使用 change buffer 了。
所以,唯一索引的更新不能使用change buffer,只有普通索引可以使用。
我们来看一下,如果在表中插入一个新记录的话,InnoDB 的处理流程,分为两种情况:
第一种情况是,这个记录要更新的目标页在内存中。这时,InnoDB的处理流程如下:
对于唯一索引来说,找到对应的位置,判断到没有冲突,插入这个值,语句执行结束;
对于普通索引来说,找到对应的位置,插入这个值,语句执行结束。
此种情况普通索引和唯一索引对更新语句性能影响的差别,只是一个判断,只会耗费微小的CPU时间。
第二种情况是,这个记录要更新的目标页不在内存中。这时,InnoDB的处理流程如下:
对于唯一索引来说,需要将数据页读入内存,判断到没有冲突,插入这个值,语句执行结束;
对于普通索引来说,则是将更新记录在 change buffer,语句执行就结束了。
change buffer 因为减少了随机磁盘访问,使更新性能提升。
change buffer 的使用场景
一个问题:普通索引的所有场景,使用 change buffer 都可以起到加速作用吗?
因为 merge 的时候是真正进行数据更新的时刻,而 change buffer 的主要目的就是将记录的变更动作缓存下来,所以在一个数据页做 merge 之前,change buffer 记录的变更越多,即这个页面上要更新的次数越多,收益就越大。
对于写多读少的业务来说,页面在写完以后马上被访问到的概率比较小,此时change buffer的使用效果最好。
但如果是写入之后马上会做查询的场景,即使将更新先记录在 change buffer,但之后由于马上要访问这个数据页,会立即触发 merge 过程。这样随机访问 IO 的次数不会减少,反而增加了 change buffer 的维护代价。对于这种业务模式来说,change buffer 起到了副作用。
change buffer 和 redo log 的区别
redo log 中的 WAL 提升性能的核心机制,也是尽量减少随机读写。
redo log 主要节省的是随机写磁盘的IO消耗(转成顺序写),而 change buffer 主要节省的则是随机读磁盘的IO消耗。
参考资料
《MySQL 45讲》
《MySQL 必知必会》
文章知识点与官方知识档案匹配,可进一步学习相关知识
Java技能树使用JDBC操作数据库数据库操作109494 人正在系统学习中
显示推荐内容
向北~
关注
0
0
打赏
0
专栏目录
目录
目录
更新过程
什么条件下可以使用 change buffer
change buffer 的使用场景
change buffer 和 redo log 的区别
参考资料
向北~
码龄1年
暂无认证
11
原创
43万+
周排名
8万+
总排名
3806
访问
等级
114
积分
0
粉丝
22
获赞
1
评论
3
收藏
习惯养成
新秀勋章
五一创作勋章
持续创作
创作能手
私信
关注
举报
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
【MySQL 30周年庆】MySQL 8.0 OCP考试限时免费!教你免费领考券
墨天轮小教习
452次阅读
2025-04-25 18:53:11
墨天轮个人数说知识点合集
JiekeXu
444次阅读
2025-04-01 15:56:03
MySQL数据库当前和历史事务分析
听见风的声音
426次阅读
2025-04-01 08:47:17
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
严少安
403次阅读
2025-04-25 15:30:58
MySQL 生产实践-Update 二级索引导致的性能问题排查
chengang
390次阅读
2025-03-28 16:28:31
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
358次阅读
2025-04-17 17:02:24
MySQL 9.3 正式 GA,我却大失所望,新特性亮点与隐忧并存?
JiekeXu
355次阅读
2025-04-15 23:49:58
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
331次阅读
2025-04-15 14:48:05
云和恩墨杨明翰:安全生产系列之MySQL高危操作
墨天轮编辑部
309次阅读
2025-03-27 16:45:26
openHalo问世,全球首款基于PostgreSQL兼容MySQL协议的国产开源数据库
严少安
300次阅读
2025-04-07 12:14:29