介绍MySQL Buffer pool里的change buffer

介绍MySQL Buffer pool里的change buffer,第1张

介绍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 触发时机

  1. 访问该数据页
  2. 系统后台线程定期merge
  3. 数据库正常关闭(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教程(视频)

以上就是介绍MySQL Buffer pool里的change buffer的详细内容,

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/704758.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-23
下一篇 2022-04-23

发表评论

登录后才能评论

评论列表(0条)

保存