浅谈mysql的change buffer

1.数据的更新过程

当mysql执行更新操作时,需要先更新一个数据页。如果这个数据页在内存中,则会直接更新,如果
这个数据页不在内存中,InnoDB会将这个更新操作缓存在change buffer中,当下次需要查询访问这个数据页的时候,会将数据页读入内存,然后执行change buffer中和这个数据页相关的操作,这样就保证了数据的逻辑正确性。

2.merge触发

将change buffer中的操作应用到原数据页,得到最新结果的过程称为merge。除了访问这个数据页会触发merge外,系统有后台线程会定期merge。在数据库正常关闭(shutdown)的过程中,也会执行merge操作。

3.使用change buffer的场景

只有普通索引的更新会使用change buffer,用来提高内存利用率,但是如果被更新的字段是唯一索引,就不会使用change buffer,因为更新操作会判断是否违反唯一约束的条件,必须将数据页读入内存才能判断,因此唯一索引不会使用change buffer,只有普通索引才能使用。
在日常业务场景中,对于写多读少的操作,使用change buffer的效果最好,例如账单类、日志类的操作,如果是读写操作都是很多的情况下,写完后将操作记录保存在change buffer中然后立即查询,这样会频繁触发merge,增加了IO的操作频率,这种场景使用change buffer并不能带来性能的提升,这种业务场景应该关闭change buffer。

4.change buffer的大小设置

在InnoDB中,可以通过参数innodb_change_buffer_max_size来设置,默认值是25,最大是50。例如当这个参数值是50 的时候,表示change buffer最多只能占用buffer pool的50%

5.索引的选择

唯一索引和普通索引在查询上并无区别,但是在更新操作上两者对性能的影响是不一样的,所以建议尽量使用普通索引。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值