MySQL Index--Change Buffer
Posted gaogao67
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL Index--Change Buffer相关的知识,希望对你有一定的参考价值。
Change Buffer功能
当执行INSERT/DELETE/UPDATE三类DML操作需要修改二级索引上数据时,如果需要修改的二级索引页未存在于当前Buffer Pool中,可以先将该"修改操作"进行缓存,等待其他操作加载二级索引页时,再将“修改操作”合并到二级索引页中,以减少二级索引修改产生的随机IO,缩短INSERT/DELETE/UPDATE三类DML操作的响应时间。
Change Buffer历史
在mysql 5.5之前版本中,仅支持INSERT 操作,因此被称为INSERT BUFFER,在MySQL 5.5之后版本中,支持INSERT/DELETE/CHANGE/PURGE等操作,因此被称为Change Buffer。
Change Buffer实现方式
1、通过bitmap数据结构中IBUF_BITMAP_FREE来标识每个数据页剩余空间范围(2bit,标识空闲空间范围0bytes/512bytes/1024bytes/2018bytes), 如果修改操作需要的空间超过2K,则不会进行缓存。
2、通过bitmap数据结构中IBUF_BITMAP_BUFFERED来标记数据页是否有缓存
3、通过bitmap数据结构中IBUF_BITMAP_IBUF来标记数据页是否是Change Buffer Tree的一部分,用于异步AIO读操作。
4、通过一颗B树来缓存二级索引的修改操作,树中每条记录通过space_id+page_no来确定数据页,在通过递增counter来标记修改顺序,其他列存放修改操作的相关数据。
Change Buffer操作类型
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操作限制
1、Change Buffer仅缓存二级索引的叶子节点,非叶子节点无法缓存。
2、Change Buffer仅能缓存二级唯一索引的DELETE操作,无法缓存INSERT操作,因为需要确保索引记录唯一性。
3、当表正在执行FLUSH TABLE时,无法对该表操作进行缓存。
4、如果表主键是降序索引或者二级索引中使用降序列,则无法使用缓存。
学习资料:
http://mysql.taobao.org/monthly/2015/07/01/
以上是关于MySQL Index--Change Buffer的主要内容,如果未能解决你的问题,请参考以下文章
MYSQL碰到The total number of locks exceeds the lock table size 问题解决记录