Change Buffer功能html
当执行INSERT/DELETE/UPDATE三类DML操做须要修改二级索引上数据时,若是须要修改的二级索引页未存在于当前Buffer Pool中,能够先将该"修改操做"进行缓存,等待其余操做加载二级索引页时,再将“修改操做”合并到二级索引页中,以减小二级索引修改产生的随机IO,缩短INSERT/DELETE/UPDATE三类DML操做的响应时间。mysql
Change Buffer历史sql
在MySQL 5.5以前版本中,仅支持INSERT 操做,所以被称为INSERT BUFFER,在MySQL 5.5以后版本中,支持INSERT/DELETE/CHANGE/PURGE等操做,所以被称为Change Buffer。数据库
Change Buffer实现方式缓存
一、经过bitmap数据结构中IBUF_BITMAP_FREE来标识每一个数据页剩余空间范围(2bit,标识空闲空间范围0bytes/512bytes/1024bytes/2018bytes), 若是修改操做须要的空间超过2K,则不会进行缓存。数据结构
二、经过bitmap数据结构中IBUF_BITMAP_BUFFERED来标记数据页是否有缓存app
三、经过bitmap数据结构中IBUF_BITMAP_IBUF来标记数据页是不是Change Buffer Tree的一部分,用于异步AIO读操做。异步
四、经过一颗B树来缓存二级索引的修改操做,树中每条记录经过space_id+page_no来肯定数据页,在经过递增counter来标记修改顺序,其余列存放修改操做的相关数据。学习
Change Buffer操做类型spa
Change Buffer缓存三种操做:INSERT/DELETE-MARK/DELETE,
因为UPDATE操做等价于DELETE+INSERT操做,而DELETE操做在MySQL数据库中会先将记录标记为DELETE再后期进行PURGE操做,所以DML操做对应INSERT/DELETE-MARK两种操做,而MySQL系统进程PURGE对应DELETE操做。
能够经过参数innodb_change_buffering来控制CHANGE BUFFER缓存操做:
参数innodb_change_buffering解释 Whether InnoDB performs change buffering, an optimization that delays write operations to secondary indexes so that the I/O operations can be performed sequentially. Permitted values are described in the following table. Values may also be specified numerically. Permitted Values for innodb_change_buffering Value Numeric Value Description none 0 Do not buffer any operations. inserts 1 Buffer insert operations. deletes 2 Buffer delete marking operations; strictly speaking, the writes that mark index records for later deletion during a purge operation. changes 3 Buffer inserts and delete-marking operations. purges 4 Buffer the physical deletion operations that happen in the background. all 5 The default. Buffer inserts, delete-marking operations, and purges. https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.html#sysvar_innodb_change_buffering
能够经过参数innodb_change_buffer_max_size来控制change buffer使用InnoDB buffer pool的比例,默认为25%,最大为50%
Change Buffer操做限制
一、Change Buffer仅缓存二级索引的叶子节点,非叶子节点没法缓存。
二、Change Buffer仅能缓存二级惟一索引的DELETE操做,没法缓存INSERT操做,由于须要确保索引记录惟一性。
三、当表正在执行FLUSH TABLE时,没法对该表操做进行缓存。
四、若是表主键是降序索引或者二级索引中使用降序列,则没法使用缓存。
学习资料: