InnoDB的三大特性 change buffer

 

1 什么是change buffer 

官网的介绍 https://dev.mysql.com/doc/refman/5.7/en/innodb-change-buffer.html

The change buffer is a special data structure that caches changes to secondary index pages when those pages are not in the buffer pool. The buffered changes, which may result from INSERTUPDATE, or DELETE operations (DML), are merged later when the pages are loaded into the buffer pool by other read operations.

从图中可以看到 buffer pool中有insert buffer page

当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InnoDB 会将这些更新操作缓存在 change buffer 中,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行 change buffer 中与这个页有关的操作。通过这种方式就能保证这个数据逻辑的正确性。

change buffer & insert buffer

change buffer的前身是insert buffer,只能对insert 操作优化;后来升级了,增加了update/delete的支持,名字也改叫change buffer.

什么是merge?

把change buffer应用到旧的数据页,得到新的数据页的过程,应该称为merge

什么时候会触发merge 

(1)访问这个数据页会触发 merge 外,

(2)系统有后台线程会定期 merge。

(3)在数据库正常关闭(shutdown)的过程中,也会执行 merge 操作。

2 使用change buffer的条件 

change buffer 只限于用在普通索引的场景下,而不适用于唯一索引

为什么不适用与唯一索引:

唯一索引的更新每次都需要把数据读入内存做唯一性检测

第二种情况是,这个记录要更新的目标页不在内存中。

这时,InnoDB 的处理流程如下:对于唯一索引来说,需要将数据页读入内存,判断到没有冲突,插入这个值,语句执行结束;

对于普通索引来说,则是将更新记录在 change buffer,语句执行就结束了。

3 change buffer的收益 (减少随机读磁盘)

将数据从磁盘读入内存涉及随机 IO 的访问,是数据库里面成本最高的操作之一。

change buffer 因为减少了随机磁盘访问,所以对更新性能的提升是会很明显的。

4 change buffer的使用场景

因为 merge 的时候是真正进行数据更新的时刻,而 change buffer 的主要目的就是将记录的变更动作缓存下来,所以在一个数据页做 merge 之前,change buffer 记录的变更越多(也就是这个页面上要更新的次数越多),收益就越大。

因此,对于写多读少的业务来说,页面在写完以后马上被访问到的概率比较小,此时 change buffer 的使用效果最好。这种业务模型常见的就是账单类、日志类的系统

反过来,假设一个业务的更新模式是写入之后马上会做查询,那么即使满足了条件,将更新先记录在 change buffer,但之后由于马上要访问这个数据页,会立即触发 merge 过程。这样随机访问 IO 的次数不会减少,反而增加了 change buffer 的维护代价。所以,对于这种业务模式来说,change buffer 反而起到了副作用。

5 关于change buffer的参数

innodb_change_buffer_max_size 50 

表示 change buffer 的大小最多只能占用 buffer pool 的 50%

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DBA之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值