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的更多相关文章

  1. mysql 原理 ~ change buffer

    一 简介:今天咱们来聊聊mysql的change buffer二 详细说明   1 +-change Buffer和数据页一样,也是物理页的一个组成部分,数据结构也是一颗B+树,这棵B+树放在共享表空 ...

  2. MySQL:change buffer

    1. 概念 Innodb维护了一个缓存区域叫做Buffer Pool,用来缓存数据和索引在内存中.其大小通过参数 innodb_buffer_pool_size 控制: change buffer 是 ...

  3. 全网最清楚的:MySQL的insert buffer和change buffer 串讲

    目录 一.前言 二.问题引入 2.1.聚簇索引 2.2.普通索引 三.change buffer存在的意义 四.再看change buffer 五.change buffer 的限制 六.change ...

  4. MySQL -- Innodb中的change buffer

    change buffer是一种特殊的数据结构,当要修改的辅助索引页不在buffer pool中时,用来cache对辅助索引页的修改.对辅助索引页的操作可能是insert.update和delete操 ...

  5. 【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 ...

  6. 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 ...

  7. mysql小特性:change buffer

    change buffer是在其他数据库中没有的一个概念,说白了就是一块系统表空间分配的空间,针对的对象是辅助索引的叶子节点(为什么不是主键索引?因为主键索引是聚集索引,在磁盘上的排列是有序的,磁盘的 ...

  8. MySql 缓冲池(buffer pool) 和 写缓存(change buffer) 转

    应用系统分层架构,为了加速数据访问,会把最常访问的数据,放在缓存(cache)里,避免每次都去访问数据库. 操作系统,会有缓冲池(buffer pool)机制,避免每次访问磁盘,以加速数据的访问. M ...

  9. Mysql InnoDB三大特性-- change buffer

    Mysql InnoDB三大特性-- change buffer

  10. 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 ...

随机推荐

  1. C#Selenium常用语法功能 很好的文章,值得参考收藏

     https://blog.csdn.net/a1003434346/article/details/80257946 https://www.jianshu.com/p/310623afcde1 h ...

  2. 创建Observable序列

    1. just()方法 该方法通过传入一个默认值来初始化 下面样例我们显示地标注出了observable的类型为Observable, 即指定了这个Observable所发出的事件携带的数据类型必须是 ...

  3. OpenStack(一)——OpenStack的相关概念

    (1).OpenStack概述 OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目. OpenStack是 ...

  4. window 10 U盘启动制作教程

    微软win10工具下载链接https://www.microsoft.com/zh-cn/software-download/windows10?OCID=WIP_r_Win10_Body_AddPC ...

  5. Gerrit - 初始配置

    1 - 插件管理 1.1 下载并安装插件 以reviewers插件为例. 在GerritForge(https://gerrit-ci.gerritforge.com/),找到对应gerrit 版本的 ...

  6. Node.js实现PC端类微信聊天软件(三)

    Github StackChat Redux学习回顾 Redux的主要功能就是管理复杂交错的State,比如需要讲state提升到顶层组件的场景中,使用Redux就很合适 Redux主要提供三个东西来 ...

  7. (IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)

    参考博客: https://www.cnblogs.com/xiao987334176/p/9056511.html 内容回顾 协程实际上是一个线程,执行了多个任务,遇到IO就切换 切换,可以使用yi ...

  8. navcat excel数据导入mysql的方法

    navcat excel数据导入mysql的方法 先navcat导出 xls格式 然后把数据复制到往这个xls里 (按照这个xls格式) 然后导入mysql就行了 如果导入的过程无法识别excel里的 ...

  9. visual studio ------- 更改字体和背景颜色

    1.打开vs   点击工具  选择选项 2.想要更换主题的也可以更换主题, 3.更改字体 4.更改为护眼小背景   参数为    85   123  205 ee

  10. Android调试桥 adb安装详解

    Android调试桥(adb) 一.简介 Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信.adb 命令便于执行各种设备操作(例如安装和调试应用),并提供对 Uni ...