什么是changebuffer?
在需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,Innodb会将这些更新操作缓存在change buffer
中,这样就不需要从磁盘读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行change buffer中与这个页有关的操作。通过这种方式能保证这个数据逻辑的正确性。需要说明的是,虽然叫change buffer,实际上它是可以持久化的数据,也就是说change buffer 在内存中有拷贝,也会被写入到磁盘上。
什么是purge操作?
将change buffer中的操作应用到原始数据页,得到最新结果的过程称为purge。除了访问这个数据页会触发purge外,系统有后台线程会定期purge。在数据库正常关闭shutdown的
过程中,也会执行purge操作。
使用场景:
因为purge的时候是真正进行数据更新的时刻,而change buffer的主要目的就是将记录的变更动作缓存下来,所以在一个数据页做purge之前,change buffer记录的变更越多,收益就越大。
因此,对于写多杜少的业务,页面在写完以后马上被访问到的概率比较小,此时使用效果最好,比如日志系统,账号系统。
反过来,假设一个业务的更新后立马会查询,那么即使满足了条件,将更新先记录在change buffer,但之后由于马上要访问这个数据页,会立即触发purge过程也难怪,
这样随机访问的IO的次数不会减少,反而增加了change buffer的维护代价,所以这种业务模式,changebuffer 反而起到了副作用。