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. docker容器跨服务器的迁移的方法

    docker的备份方式有export和save两种. export是当前的状态,针对的是容器,docker save 是针对镜像images. export 找出要备份容器的ID ? 1 2 3 [r ...

  2. gdb x命令使用方法

    x命令是直接查看指定地址为开头的内存里的内容 既然是要看,就分你想怎么看,和看多少 怎么看: d 按十进制格式显示 x 按十六进制格式显示 a 按十六进制格式显示 u 按十六进制格式显示无符号整型 o ...

  3. unittest单元测试,基于java的junit测试框架

    import unittestclass study(unittest.TestCase): def testXia(self): self.assertEqual((3*4),20) def tes ...

  4. day52_9_16Django中的静态文件和orm

    一.静态文件配置 在配置静态文件时,需要创建一个文件夹在Django项目文件夹下,名字与使用无关. 静态文件包括html等使用的不会变动的插件文件等.分为三个部分: css文件夹 当前网站所有的样式文 ...

  5. nginx 一键安装

    #!/bin/bash1. 关闭防火墙 和 selinux service iptables stopsetenforce 0 2. 判断是否有nginx服务netstat -ntlp |grep n ...

  6. Spring Security OAuth2学习

    什么是 oAuth oAuth 协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需 ...

  7. Win10 企业版ltsc 无法访问samba网络共享问题及解决!(转)

    1.本地安全策略,本地策略-安全选项,需要修改成默认的值的修改方式:查找注册表浏览到 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\LSA直接 ...

  8. redis.windows.conf 配置注释

    . daemonize no Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 . pidfile /var/run/redis_6379.pid 当Redis以守 ...

  9. Nginx的性能优化方案

    nginx的优化 . gzip压缩优化 . expires缓存有还 . 网络IO事件模型优化 . 隐藏软件名称和版本号 . 防盗链优化 . 禁止恶意域名解析 . 禁止通过IP地址访问网站 . HTTP ...

  10. java使用jxls导出Excel

    jxls是基于POI的Excel模板导出导入框架.通过使用类似于jstl的标签,有效较少导出Excel的代码量. 1.pom <!-- https://mvnrepository.com/art ...