共计 1375 个字符,预计需要花费 4 分钟才能阅读完成。
自动写代码机器人,免费开通
丸趣 TV 小编给大家分享一下 MySQL Buffer pool 里的 change buffer 是什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
4 change buffer
4.1 基本概念
change buffer 是一种特殊的数据结构,当这些页面不在缓冲池中时,这些高速缓存会将更改缓存到辅助索引页面。可能由 INSERT,UPDATE 或 DELETE 操作(DML)导致的缓冲更改将在以后通过其他的读取操作将页加载到缓冲池中时合并。
相关免费学习推荐:mysql 视频教程
如上图可见,change buffer 用的是 buffer pool 里的内存,所以不能无限增长。change buffer 大小可通过参数 innodb_change_buffer_max_size 动态设置。
比如设置为 50:change buffer 的大小最多只能占用 buffer pool 的 50%。
需更新一个数据页时:
页在内存,直接更新
页不在内存,在不影响数据一致性下,InooDB 会将这些更新操作缓存于 change buffer,而无需从磁盘读入页
在下次查询访问该数据页时,才将数据页读入内存,然后执行 change buffer 中与这个页有关的操作。通过该方式就能保证该数据逻辑的正确性。
change buffer 实际上也是可持久化的数据,即它不仅在内存中有拷贝,也会被写进磁盘。
4.2 merge
将 change buffer 中的操作应用到原数据页,得到最新结果的过程。
4.2.1 触发时机
访问该数据页
系统后台线程定期 merge
数据库正常关闭(shutdown)的过程
若能将更新操作先记录在 change buffer,减少读盘,语句执行速度便会明显提升。且数据读入内存需要占用 buffer pool,因此也能降低内存占用,提高内存利用率。
4.3 何时使用 change buffer
对于唯一索引,更新操作都要先判断该操作是否违反唯一性约束:
比如,要插入 (4,400) 记录,要先判断表中是否已存 k = 4 记录,就必须要将数据页读入内存来判断。若都已读入内存了,那直接更新内存自然很快,没必要使用 change buffer。
因此,唯一索引的更新不能使用 change buffer,只有普通索引可使用。
4.4 适用场景
难道普通索引的所有场景,使用 change buffer 都可加速吗?
注意 merge 才是真正进行数据更新时刻,change buffer 主要是将记录的变更动作缓存。所以在一个数据页做 merge 前,change buffer 记录变更越多(即该数据页上要更新的次数越多),收益越大。
写多读少业务,页面在写完后马上被访问到的概率较小,change buffer 使用效果最好。常见为账单、日志类系统。
写后马上查询,将先新记录在 change buffer,但之后由于立即访问该数据页,又很快触发 merge,这样的话随机访问 IO 次数不会减少,反而增加 change buffer 维护代价,change buffer 起了副作用。
以上是“MySQL Buffer pool 里的 change buffer 是什么”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!
向 AI 问一下细节