系列文章目录
1. MySQL innodb引擎架构分析-Buffer Pool
2. MySQL innodb引擎架构分析-Redo log
3. MySQL innodb引擎架构分析- Double Write Buffer
4.MySQL innodb引擎架构分析-Change Buffer
文章目录
- 系列文章目录
- 前言
- 一、Change Buffer是什么?
- 二、Change Buffer的步骤
- 1.更新过程
- 2.读取过程
- 三、Change Buffer配置参数
- 总结
前言
当需要更新一个数据页时,如果数据页在内存中就直接更新,如果数据页不在内存中,这样为了保证数据一致性每次都去磁盘修改数据,大大降低了数据库性能,Change Buffer就是为了解决此问题,如果数据页不在内存中InooDB 会将这些更新操作缓存在 change buffer 中,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行 change buffer 中与这个页有关的操作。通过这种方式就能保证这个数据逻辑的正确性。虽然名字叫作 change buffer,实际上它是可以持久化的数据,change buffer 在内存中有拷贝,也会被写入到磁盘上(ibdata)。
一、Change Buffer是什么?
change buffer对页进行了写操作的情况下,先将记录变更缓冲,等未来数据被读取时,再将 change buffer 中的操作合并到原数据页的技术。在MySQL5.5之前,叫插入缓冲(insert buffer),只针对insert做了优化;现在对delete和update也有效,叫做写缓冲(change buffer)。它是可以持久化的数据,change buffer 在内存中有拷贝,也会被写入到磁盘上(ibdata)。
二、Change Buffer的步骤
1.更新过程
如果我们执行如下2个sql;
update t set a = 1 where c = 1;#page1
update t set b = 100 where d = 10000;#page2
如果数据页page1在内存中,直接更新数据
如果page2没有在内存中,会将更新操作缓存到 change buffer 中,减少了 IO 操作,提高了性能。 先将更新操作记录在 change buffer 中,在之后再进行查询数据时 merge,真正进行数据更新。
将上面2个动作记录redo log
2.读取过程
如果在我们执行了上面更新后的sql后,我们执行如下2个sql;
select * from t where c = 1;#page1
select * from t where d = 10000;#page2
page1在内存中,并且在上面执行更新时也已经更新了,会直接返回内存中的数据(这个页内的数据可能已经刷到磁盘中,MySQL有多重刷盘机制)
page2没有在内存中,会先从磁盘种读出,然后发现Change Buffer有更新,会把数据合并在返回给上层应用,这是内存中是最新数据了,等MySQL下次刷盘就持久化到磁盘中。
三、Change Buffer配置参数
innodb_change_buffer_max_size 表示 Change Buffer 最大大小占 Buffer Pool 的百分比,默认为 25%。最大可以设置为 50%。
innodb_change_buffering 参数用来控制对哪些操作启用 Change Buffer 功能,默认是:all。
innodb_change_buffering 参数有以下几种选择:
all 默认值。开启buffer
none 不开启change buffer
inserts: 只是开启buffer insert操作
deletes: 只是开delete-marking操作
changes: 开启buffer insert操作和delete-marking操作
purges: 对只是在后台执行的物理删除操作开启buffer功能
总结
change buffer 只是在下次用到该数据页的时候,会在这个时候 进行 merge 操作。如果每次更新后立马会读取数据,随机IO访问并不会减少,反而增加了 change buffer 的维护代价。
在以下几种情况开启 Change Buffer 是会使得 MySQL 有明显提升:
1、数据库大部分都是非唯一索引;
2、业务是写多读少
3、写入数据之后并不会立即进行读取它。