一 简介:今天咱们来聊聊mysql的change buffer
二 详细说明
   1 +-change Buffer和数据页一样,也是物理页的一个组成部分,数据结构也是一颗B+树,这棵B+树放在共享表空间中,默认ibdata1中。change buffer 写入系统表空间机制应该和普通表的脏页刷新到磁盘是相同的机制--Checkpoint机制
  2  具体查看
   show engines inndo status 过滤
   Ibuf: size 1, free list len 14316, seg size 14318, 466174 merges(已经合并的meregs数量)
   merged operations: insert 547399(插入记录被merge的次数), delete mark 42008(删除操作被merge的次数), delete 32055(更新操作被merge了多少次)
   如果merges/merged的值等于3/1,则代表插入缓冲对于非聚集索引页的IO请求大约降低了3倍
三 具体过程
通用操作
  1 判断目标数据页是否在内存中 -> 在, 直接操作数据页(更新,插入)
   -> 不在,将操作缓冲到change buffer中>在下次进行操作这个数据页时,数据页读入内存,进行操作数据页(更新,插入)->写事务日志
  2 merge 触发条件 >定期刷新 change buffer到ibdata中进行物理保存
    1 当目标数据页被读取到内存时进行操作
    2 master thread 每隔10s会进行操作
    3 当mysql关闭时会触发进行操作
  3 change buffer备份
    change buffer虽然是内存的空间,也会定期刷新到磁盘,保证数据安全
4 change buffer目标
   插入更新删除操作的辅助索引数的维护操作
   补充:为何要非唯一性索引,因为唯一性索引需要确定唯一性,就必然要从硬盘读取数据页,那么change buffer也失去了自己的作用
5 change buffer的相关参数
 1 innodb_change_buffering 默认是all支持所有DML操作
 2 innodb_change_buffer_max_size,默认是25,即缓冲池的1/4。最大可设置为50,采用默认即可
6 目的
  减少了从内存读取硬盘的随机读IO(数据页)操作,redo log减少了随机写log操作
四 现实例子
 1 举个现实中的例子来做说明,我们去图书馆还书,对应图书馆来说,他是做了insert(增加)操作,管理员在1小时内接受了100本书,这时候他有2种做法把还回来的书归位到书架上
    1)每还回来一本书,根据这本书的编码(书柜区-排-号)把书送回架上
    2)暂时不做归位操作,先放到柜面上,等不忙的时候,再把这些书按照书柜区-排-号先排好,然后一次性归位
   用方法1,管理员需要进出(IO)藏书区100次,不停的登高爬低完成图书归位操作,累死累活,效率很差。
   用方法2,管理员只需要进出(IO)藏书区1次,对同一个位置的书,不管多少,都只要爬一次楼梯,大大减轻了管理员的工作量。
   所以图书馆都是按照方法2来做还书动作的。而且如果暂时不归还,需要相应的柜子进行保存,相当于数据库的insert buffer
 2 为什么对于非聚集索引(非唯一)的插入和更新有效?
 还是用还书的例子来说,还一本书A到图书馆,管理员要判断一下这本书是不是唯一的,他在柜台上是看不到的,必须爬到指定位置去确认,这个过程其实已经产生了一次IO操作,相当于没有节省任何操作。
 所以这个buffer只能处理非唯一的插入,不要求判断是否唯一。聚集索引就不用说了,它肯定是唯一的,mysql现在还只能通过主键聚集。
3 前面说到管理员图书归位的时候,他会选择在“不忙的时候”再去做,优先处理前台退书操作,这个在MYSQL里面是这样体现的:
  1)每1秒,如果IO次数小于5,合并插入缓冲。
  2)每10秒,IO次数小于200,合并最多5个插入缓冲。
五 适用场景
  事务进行操作后不会立刻查看的场景(写多读少),因为如果立刻查看会频繁的触发merge
六 补充
1 看完了上面的优化措施,我们应当明白了一点,为什么mysql不提倡建立很多无用的索引,因为每个辅助索引都需要成本来维护,虽然有了change buffer,还应该尽量避免建立无序索引
2 对于innodb的恢复机制应该加上change buffer 最后为 change buffer+redo log+binlog

mysql 原理 ~ change buffer的更多相关文章

  1. MySQL:change buffer

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

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

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

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

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

  4. MySQL -- Innodb中的change buffer

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

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

    Mysql InnoDB三大特性-- change buffer

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

  8. mysql小特性:change buffer

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

  9. 《Mysql - 索引(唯一索引和普通索引的选择)Change Buffer 》

    一:概述 - 如果业务代码已经保证了不会写入重复的身份证号. - 从性能的角度考虑,你会为这个身份证号,选择唯一索引还是普通索引呢?选择的依据是什么呢? - 这就要从他们的执行过程看起. 二:唯一索引 ...

随机推荐

  1. Luogu3676 小清新数据结构题(树链剖分+线段树)

    先不考虑换根.考虑修改某个点权值对答案的影响.显然这只会改变其祖先的子树权值和,设某祖先原子树权值和为s,修改后权值增加了x,则对答案的影响为(s+x)2-s2=2sx+x2.可以发现只要维护每个点到 ...

  2. Spring的编程式事务和声明式事务

    事务管理对于企业应用来说是至关重要的,当出现异常情况时,它也可以保证数据的一致性. Spring事务管理的两种方式 spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务使用Transa ...

  3. mysql test== 坑

    错误 <if test="status == '1'"> 正确 <if test="status == '1'.toString()">

  4. emwin之窗口关闭按钮用法

    @2018-07-27 [小记] 使用函数 FRAMEWIN_AddCloseButton() 实现关闭当前窗口的功能时,调用其窗口的父窗口必须处于打开状态,否则将导致假死(当前窗口死了,系统还在工作 ...

  5. 【AGC010D】Decrementing

    Solution 日常博弈论做不出来. 首先,数值全部为1的局面先手必败. 在接下来的过程中,我们只关注那些大于1的数值. 按照官方题解的思路,首先想一个简化版的问题:没有除的操作,其余相同.那么局面 ...

  6. luogu1600 [NOIp2016]天天爱跑步 (tarjanLca+dfs)

    经过部分分的提示,我们可以把一条路径切成s到lca 和lca到t的链 这样就分为向上的链和向下的链,我们分开考虑: 向上:如果某一个链i可以对点x产生贡献,那么有deep[x]+w[x]=deep[S ...

  7. poj 1236(强连通分量分解模板题)

    传送门 题意: N(2<N<100)个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输. 问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都 ...

  8. saltstack 基本操作

    一.常用操作 ①.模块查看 #查看全部模块 [root@k8s_master ~]# salt '*' sys.list_modules # "*"为所有node节点 (此处可以写 ...

  9. 原生ajax中get和post请求

    后台代码: class AjaxHanlder(tornado.web.RequestHandler): def get(self): print(self.get_argument('type',N ...

  10. centos6.5环境下安装zk

    第一步:先下载安装包,解压. 第二步:进去根目录,创建data文件夹  mkdir  data 第三步:进去conf文件夹,修改  zoo_sample.cfg    的名字   mv zoo_sam ...