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. 7.python3实用编程技巧进阶(二)

    2.1.如何拆分含有多种分隔符的字符串 #2.1.如何拆分含有多种分隔符的字符串 s = 'ab;cd|efg|hi,jkl|mn\topq;rst,uvw\txyz' #第一种方法 def my__ ...

  2. MySQL 部署分布式架构 MyCAT (五)

    分片(水平拆分) 4.全局表 业务使用场景: 如果你的业务中有些数据类似于数据字典,比如配置文件的配置, 常用业务的配置或者数据量不大很少变动的表,这些表往往不是特别大, 而且大部分的业务场景都会用到 ...

  3. RAID几种方式

    RAID(Redundant Array of Independent Disk 独立冗余磁盘阵列)技术是加州大学伯克利分校1987年提出,最初是为了组合小的廉价磁盘来代替大的昂贵磁盘,同时希望磁盘失 ...

  4. 【矩阵快速幂】之奥运 hdu 2254

    1.城市的编号不是从0到n-1,而是随便的一个数字,需要离散化否则不能存相关信息 2.城市数不超过30,也就是说我的方法开矩阵不超过60,但是我残念的一开始以为最多可能有20000个不同城市    血 ...

  5. 使用Appium进行微信公众号自动化测试

    查看Android的webview视图版本:手机链接电脑后在电脑Chrome打开页面chrome://inspect/#devices查看Android的Chrome内核版本     下载与该版本相对 ...

  6. MySQL SQL DML (数据操作语言)

    包括 SELECT, UPDATE, DELETE, INSERT SELECT 从数据库表中获取数据 用法 SELECT name FROM students; SELECT name,age FR ...

  7. 小程序-tabBar简易版

    <!-- 结构 --> <view class="wrapper"> <block wx:for="{{desc}}"> & ...

  8. Windows开机自动登录账户

    如何在Windows设了账户密码的情况下开机自动登录账户,有以下两种方法. 通过Windows设置自动登录 按“Win+R”组合键打开“运行”框内输入“netplwiz”. 打开以下窗口,将“要使用本 ...

  9. AtCoder Grand Contest 037

    Preface 这篇咕了可能快一个月了吧,正好今天晚上不想做题就来补博客 现在还不去复习初赛我感觉我还是挺刚的(微笑) A - Dividing a String 考虑最好情况把每个字符串当作一个来看 ...

  10. 海边拾贝-B-优秀博客/网站

    记下若干优秀博客,方便后期检索.会不定期更新: 优秀的程序员,从使用Github开始:https://help.github.com/en/github/managing-your-work-on-g ...