Change Buffer属于Innodb内存中的一块结构,它主要用来缓存对二级索引数据的修改(insert, update, delete)操作当二级索引不在Buffer pool中的时候,这些写操作会在稍后合并到二级索引当二级索引被其他读请求加载到buffer pool的时候。

不同于聚簇索引,二级索引通常不是唯一的,插入二级索引的顺序是相对随机的,删除和更新操作也可能会影响二级索引中不想临的页,在稍后当受影响的页被其他操作加载到buffer pool的时候会合并缓存在change buffer的更新,以此来避免大量的随机IO操作。

这些合并操作会在系统空闲的时候定期执行,或者在系统关闭的时候,将这些对索引页的更新写入磁盘。比起每次更新都写磁盘,这种purge 操作能够更有效的将一系列更新写入磁盘块。

当有许多被影响的行和大量的二级索引被更新,change buffer的合并操作可能会花费几个小时的时间。在这期间,磁盘IO会增加,这也会导致明显的磁盘查询缓慢。change buffer 合并可能在事务提交后继续执行,甚至MySQL server 重启之后。

在内存中,change buffer占用buffer pool的一部分,在磁盘上,change buffer是系统表空间(system tablespace)的一部分,当服务器停机的时候,change buffer会缓存在磁盘上。

change buffer 不支持包含逆序或者主键包含一个逆序字段的索引。

配置 Change Buffering


由于它能减少磁盘读写,Change buffer的特性对于IO高的应用最有用,比如有大量DML操作如批量插入的应用。

然而,change buffer占用了buffer pool的一部分,减少了用于缓存数据页的内存。如果工作集非常适合buffer pool(buffer pool中能缓存下所有的数据和索引),或者你的表有很少的二级索引,那么禁用change buffer也许是有用的。

 使用 innodb_change_buffering 来配置change buffer中缓存的数据类型,默认值为 all ;

此值的取值有:

  • all : 默认值,包含insert ,delete_marking, 和 purges.
  • none: 禁用change buffer
  • inserts : 缓存插入操作
  • deletes : 缓存删除操作
  • changes: 包含 insert delete-marking 
  • purge:  后台的物理删除操作

使用 innodb_change_buffer_max_size 变量来配置change buffer的大小,这是一个百分比值,占整个buffer pool的比例,默认值为25,最大可以设置为 50,也就是占用buffer pool的一半。

监控 Change Buffer

  • Innodb 标准监控输出包含了change buffer的信息,执行 SHOW ENGINE INNODB STATUS 语句
 mysql> SHOW ENGINE INNODB STATUS\G

change buffer的统计信息在 INSERT BUFFER AND ADAPTIVE HASH INDEX 这行下面

 -------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
merged operations:
insert 0, delete mark 0, delete 0
discarded operations:
insert 0, delete mark 0, delete 0
Hash table size 4425293, used cells 32, node heap has 1 buffer(s)
13577.57 hash searches/s, 202.47 non-hash searches/s

Innodb Change Buffer的更多相关文章

  1. mysql-5.7 innodb change buffer 详解

    一.innodb change buffer 介绍: 1.innodb change buffer 是针对oltp场景下磁盘IO的一种优化(我也感觉这个不太像人话,但是它又非常的准确的说明 innod ...

  2. MySQL 5.5: InnoDB Change Buffering

    To speed up bulk loading of data, InnoDB implements an insert buffer, a special index in the InnoDB ...

  3. INNODB insert buffer 简单分析

    在mysql5.1 之前称为Insert Buffer, 优化2级非唯一索引上插入操作的读IO, 在5.5之后改名为Change Buffer, 功能也扩展为2级非唯一索引上的插入.删除.更新.pur ...

  4. InnoDB关键特性之change buffer

    一.关于IOT:索引组织表 表在存储的时候按照主键排序进行存储,同时在主键上建立一棵树,这样就形成了一个索引组织表,一个表的存储方式以索引的方式来组织存储的. 所以,MySQL表一定要加上主键,通过主 ...

  5. MySQL -- Innodb中的change buffer

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

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

    Mysql InnoDB三大特性-- change buffer

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

  8. innodb insert buffer 插入缓冲区的理解

    今天在做一个大业务的数据删除时,看到下面的性能曲线图 在删除动作开始之后,insert buffer 大小增加到140.对于这些状态参数的说明 InnoDB Insert Buffer 插入缓冲,并不 ...

  9. 14.6.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering

    14.6.5 Configuring InnoDB Change Buffering 配置InnoDB Change Buffering 当插入,更新,和删除操作在表上执行, 索引列的值(特别是 se ...

随机推荐

  1. 2019 Multi-University Training Contest 1 String(序列自动机+贪心)

    题意 链接:https://vjudge.net/problem/HDU-6586 给你一个字符串和k,还有每个字符出现次数的限制,求一个长度为k的字典序最小的满足限制的子序列. 思路 先构造出序列自 ...

  2. postman---postman参数关联

    我们做接口测试的时候都会遇到一个场景,就是参数关联,所谓的参数关联就是上一个参数的返回值用于下一个参数的请求中,通过python中requests我们知道如何请求,那么通过postman如何请求? 参 ...

  3. java面试填坑解惑篇

    感谢原文出处:https://www.cnblogs.com/javazhiyin/ NO1.请简单描述JDK和JRE的区别? NO1.回答JDK和JRE的区别这道题,首先要回答两个名次的概念,JDK ...

  4. 关于tomcat的环境参数配置

    在linux里 export CATALINA_OPTS=”-Xms(min heap)m -Xmx(max heap)m” 修改堆内存: -XX:MaxPermSize=128m 修改最大持久带内存 ...

  5. jmeter beanshell断言接口自动化实例

    一.JMeter介绍 Apache JMeter是一款优秀的开源性能测试工具,在国外无论是在性能测试还是接口测试领域都有着非常高的使用率,但由于本身没有完善的中文文档以及典型开源工具特点(界面不美观) ...

  6. 面向对象程序设计(JAVA) 第8周学习指导及要求

    2019面向对象程序设计(Java)第8周学习指导及要求 (2019.10.18-2019.10.21)  学习目标 掌握接口定义方法: 掌握实现接口类的定义要求: 掌握实现了接口类的使用要求: 理解 ...

  7. Codeforces Round #606 (Div. 2, based on Technocup 2020 Elimination Round 4)

    链接 签到题,求出位数,然后9*(位数-1)+ 从位数相同的全一开始加看能加几次的个数 #include<bits/stdc++.h> using namespace std; int m ...

  8. [C1W4] Neural Networks and Deep Learning - Deep Neural Networks

    第四周:深层神经网络(Deep Neural Networks) 深层神经网络(Deep L-layer neural network) 目前为止我们学习了只有一个单独隐藏层的神经网络的正向传播和反向 ...

  9. MongoDB Java(七)

    在 Java 程序中如果要使用 MongoDB,你需要确保已经安装了 Java 环境及 MongoDB JDBC 驱动. mongodb-driver jar 下载地址:http://central. ...

  10. 不获取元素,直接使用id操作dom元素

    今天无意中发现个让我很吃惊的问题. 不使用getElementById方法,也可以用id直接操作有id的元素. 继续搜索后,发现name也可以直接操作... 这让我大感意外,了解以后,忍不住写点东西记 ...