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 Do not buffer any operations.
inserts Buffer insert operations.
deletes Buffer delete marking operations; strictly speaking, the writes that mark index records for later deletion during a purge operation.
changes Buffer inserts and delete-marking operations.
purges Buffer the physical deletion operations that happen in the background.
all 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 原理 ~ change buffer
		
一 简介:今天咱们来聊聊mysql的change buffer二 详细说明 1 +-change Buffer和数据页一样,也是物理页的一个组成部分,数据结构也是一颗B+树,这棵B+树放在共享表空 ...
 - MySQL:change buffer
		
1. 概念 Innodb维护了一个缓存区域叫做Buffer Pool,用来缓存数据和索引在内存中.其大小通过参数 innodb_buffer_pool_size 控制: change buffer 是 ...
 - 全网最清楚的:MySQL的insert buffer和change buffer 串讲
		
目录 一.前言 二.问题引入 2.1.聚簇索引 2.2.普通索引 三.change buffer存在的意义 四.再看change buffer 五.change buffer 的限制 六.change ...
 - MySQL -- Innodb中的change buffer
		
change buffer是一种特殊的数据结构,当要修改的辅助索引页不在buffer pool中时,用来cache对辅助索引页的修改.对辅助索引页的操作可能是insert.update和delete操 ...
 - 【MySQL 5.7 Reference Manual】15.4.2 Change Buffer(变更缓冲)
		
15.4.2 Change Buffer(变更缓冲) The change buffer is a special data structure that caches changes to se ...
 - MySQL 5.7 Reference Manual】15.4.2 Change Buffer(变更缓冲)
		
15.4.2 Change Buffer(变更缓冲) The change buffer is a special data structure that caches changes to se ...
 - mysql小特性:change buffer
		
change buffer是在其他数据库中没有的一个概念,说白了就是一块系统表空间分配的空间,针对的对象是辅助索引的叶子节点(为什么不是主键索引?因为主键索引是聚集索引,在磁盘上的排列是有序的,磁盘的 ...
 - MySql 缓冲池(buffer pool) 和 写缓存(change buffer)  转
		
应用系统分层架构,为了加速数据访问,会把最常访问的数据,放在缓存(cache)里,避免每次都去访问数据库. 操作系统,会有缓冲池(buffer pool)机制,避免每次访问磁盘,以加速数据的访问. M ...
 - Mysql InnoDB三大特性-- change buffer
		
Mysql InnoDB三大特性-- change buffer
 - insert buffer/change buffer double write buffer,双写 adaptive hash index(AHI) innodb的crash recovery innodb重要参数 innodb监控
		
https://yq.aliyun.com/articles/41000 http://blog.itpub.net/22664653/viewspace-1163838/ http://www.cn ...
 
随机推荐
- sed 变量在shell引用
			
#!/bin/bashZipName=`ls -lt /data/office_services/*.zip | head -1 | awk -F"/" '{print $NF}' ...
 - C# .NET “公钥证书” (.cer .pem)转换为 RSACryptoServiceProvider 对象。导出“公钥”
			
“公钥证书” .cer 文件是直接可以用X509Certificate2 对象来读取的,但 .cer 文件 不便于存储. “公钥证书” .pem 文件内容如下: -----BEGIN CERTIFIC ...
 - pdf转换成jpg不清晰怎么办
			
用Photoshop打开pdf文件,然后用“文件”-“另存为”“JPG”.
 - 在ensp上实现ospf与acl综合应用实例
			
acl命令主要是进行控制 我们搭建一下拓扑图 实验内容 分析:1.我们需要规划多个ospf域 2.财务和研发部所在的区域不受其他区域链路不稳定性影响 3.在R1,R2,R3上设置acl规则,限制只有I ...
 - 前端与编译原理 用js去运行js代码 js2run
			
# 前端与编译原理 用js去运行js代码 js2run 前端与编译原理似乎相隔甚远,各种热门的框架都学不过来,那能顾及到这么多底层呢,前端开发者们似乎对编译原理的影响仅仅是"抽象语法树&qu ...
 - Java开发笔记(一百四十四)实现FXML对应的控制器
			
前面介绍了如何通过fxml文件编排界面布局,可是光有静态界面根本没法处理业务,必须另外书写业务逻辑的代码,方能响应各按钮的单击事件,并将业务结果即使呈现到界面上.显然,fxml内部写不了Java代码, ...
 - Python之路【第三十一篇】:django ajax
			
Ajax 文件夹为Ajaxdemo 向服务器发送请求的途径: 1.浏览器地址栏,默认get请求: 2.form表单: get请求 post请求 3.a标签,超链接(get请求) 4.Ajax请求 特点 ...
 - Python有用的内置函数divmod,id,sorted,enumerate,input,oct,eval,exec,isinstance,ord,chr,filter,vars,zip
			
divmod(a, b) 函数接收两个数字类型(非复数)参数,返回一个包含商和余数的元组(a // b, a % b) id() 函数用于获取对象的内存地址. sorted(iterable, key ...
 - php GD 和图像处理函数, 制作一张图片
			
php GD 和图像处理函数, 制作一张图片 // GD 和图像处理函数 // https://www.php.net/manual/zh/ref.image.php // https://www.p ...
 - pytest_allure2 生成html报告
			
前言 allure是一个report框架,支持java的Junit/testng等框架,当然也可以支持python的pytest,也可以集成到Jenkins上展示高大上的报告界面. 环境准备 ...