change buffer
- 1.innoDB数据按数据页为单位读写,读一条记录,不是将记录本身从磁盘读出,以页为单位整体读入内存,数据页大小默认16KB
1.更新过程
-
1.更新数据页,数据页在内存中直接更新,数据页还没有在内存中,inooDB将更新操作缓存congruentchange buffer 下次查询需要访问这个数据页时,将数据页读入内存,执行change buffer 中这个页的操作
-
2.change buffer : 是持久化的数据,change buffer在内存中有拷贝,也会被写入磁盘
-
3.将change buffer中的操作应用到原数据页,得到最新结果的过程为marge,除了访问过程会触发,系统后期会 marge,在数据库正常关闭的过程也会执行marge操作
-
4.将更新操作先记录在change buffer,减少读磁盘,语句的执行速度会明显提升。
数据希尔内存需要占用buffer poopl,先记录能避免占用内存提高内存利用率。
使用change buffer条件
-
1.对于唯一索引,所有的更新操作先判断这个操作是否违反唯一约束性,插入数据会判断是否存在这个记录,这个操作需要将数据页读入内存才能判断,没必要使用change buffer,实际应用到的是普通索引
-
2. change buffer 用的是buffer pool 里的内存,不能无限增大,change大小可以通过innodb_change_buffer_max_size设置,这个参数为50,表示大小最多赚pool的50%
change buffer 的使用场景
-
1.数据页做merge,change buffer记录的变更越多(更新次数越多),收益约高
-
2.更新模式写入马上查询,立即出发merge过程,所及访问IO的次数不会减少,反而增加了change buffer维护代价
change buffer 和 redo log
-
1.WAL之后读数据不一定读磁盘不一定从redo log中把数据更新才可返回
-
redo log主要节省的是随机写磁盘的io消耗,change buff 主要节省的是随机读磁盘的io消耗