变更缓冲池简介
目录
编辑
1. 变更缓冲池的作用
2. 为什么是二级索引
3. 缓冲类型
1. 变更缓冲池的作用
提升修改数据时的效率
怎么提升修改效率呢 ?
更缓冲区用来缓存对二级索引数据的修改,当数据页没有被回载到内存中时先把修改缓存起来,等到其他查询操作发生时数据页被加载到内存后,再直接修改内存中的数据页,从而达到减少磁盘1/0的目的。
变更缓冲区用来缓存对二级索引数据的修改,是一个特殊的数据结构,当使用INSERT、UPDATE或DELETE 语句修改二级索引对应的数据时,如果对应的数据页在缓冲池中则直接更新,如果不在缓冲池中,那么就把修改操作缓存到变更缓冲区,这样就不用立即从磁盘读取对应的数据页了,当之后的读操作将对应的数据页从磁盘加载到缓冲池中时,变更缓冲区中缓存的修改操作再批量合并到缓冲池,从而达到减少磁盘I/O的目的。执行流程如图所示 :
2. 为什么是二级索引
由于聚集索引具有唯一性,我们分析一下聚集索引为什么不能被放入变更缓存,假设表中有一个主键(ID),现在有两条INSER 语句,都在插入数据时ID的值相同(id=1),那么在变更缓冲区中就存在两个修改操作,如果以后要合并到缓冲池中,这时就会出现重复的主键值,所以聚集索引的修改不能被加入到变更缓冲区;
与聚集索引不同,二级索引通常是不唯一的,并且向二级索引中插入数据时由于数据列不同,所以位置相对随机,同样对于删除和更新操作可能会影响不相邻的二级索引页,如果每次都从磁盘读取数据就会发生大量的随机I/0,以变更缓冲区的方式先将修改缓存起来,当真正的读取数据时再把修改合并到缓冲池中可以提升效率。
3. 缓冲类型
在修改二级索引数据时变更缓冲区可以减少磁盘I/O从而提高效率,但是变更缓冲区占用了缓冲池的一部分空间,从而减少了可用于缓存数据页的内存,如果业务场景读多写少,或者表中的二级索引相对较少,那么可以考虑禁用更改缓冲从而提高缓冲池空间。
可以通过选项文件或 SET GLOBAL 语句对系统变量 innodb_change_buffering 进行设置,来控制变更缓冲区对于插入、册删除操作(索引记录被标记为删除)和清除操作(当索引记录被物理删除时)的开启或禁用
all:默认值,缓存插入、删除标记操作和清除
none:不缓存任何操作
inserts:只缓存插入操作
deletes :只缓存删除标记操作
changes:缓存插入和删除标记操作
purges :缓存发生在后台的物理删除操作