mysql里innodb的changeBuffer有关要点

Change buffer

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

Change buffer其实和pageCache 有一些像,但是又有一些根本的区别,但是他们都能加速,修改后短期在此访问时,的磁盘io情况。

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

Change buffer 的merge(持久化)

访问这个磁盘数据页时会触发 merge ,系统有后台线程会定期 merge

change buffer的merge操作,先把change buffer的操作更新到内存的数据页中,此操作写到redo log中,mysql未宕机,redo log写满后需要移动check point点时,通过判断内存中数据和磁盘是否一致即是否是脏页来刷新到磁盘中,当mysql宕机后没有内存即没有脏页,通过redo log来恢复。

什么条件下可以使用 change buffer

唯一索引不可以用:对于唯一索引来说,所有的更新操作都要先判断这个操作是否违反唯一性约束,必须读入内存进行判断。比如:插入数据(1,100),就需要先判断原本表中是否存在key为1的记录,所以必须讲数据页读入内存。

只有普通索引可以使用

change buffer 的使用场景

对于写多读少的业务来说,页面在写完以后马上被访问到的概率比较小,此时 change buffer 的使用效果最好。

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

redolog和changebuffer

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

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

更新(insert)具体的操作:

更新语句,你会发现它涉及了四个部分:内存、redo log(ib_log_fileX)、 数据表空间(t.ibd)、系统表空间(ibdata1)。

  1. Page 1 在内存中,直接更新内存;
  2. Page 2 没有在内存中,就在内存的 change buffer 区域,记录下“我要往 Page 2 插入一行”这个信息
  3. 将上述两个动作记入 redo log 中。

异常掉电是否会丢失记录?

不会的,(上面提到了),在使用changebuffer进行更新加速时,还会同步往redolog中追加对changebuffer的修改,所以异常掉电还可以使用redolog进行恢复。(也涉及对redolog的设定是否为同步写入有关,这里不考虑redolog的数据丢失情况)

调整Changebuffer大小

change buffer 用的是 buffer pool 里的内存,因此不能无限增大。

change buffer 的大小,可以通过参数 innodb_change_buffer_max_size 来动态设置。这个参数设置为 50 的时候,表示 change buffer 的大小最多只能占用 buffer pool 的 50%。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值