文章部分总结描述来自参考文章,属于半原创。

概述

    文章将会介绍 change buffer 相关的知识点

查看 MySQL InnoDB 状态的命令

SHOW ENGINE INNODB STATUS;

这个命令可以查看带InnoDB 引擎当前线程和 buffer pool 的一些状态,对于学习MySQL 很有帮助。(里面的参数都搞懂了就差不多了,哈哈哈)

Change Buffer 是什么

    我们更新一条记录的时候,首先会去buffer pool 寻找这条数据,假如该数据存在,那么直接更新在内存中的纪录(合适的时候会回刷)。但是要是buffer pool 不存在呢 ?MySQL 为了避免每次遇到这样的情况都会去磁盘上加载数据,于是就设计了 change buffer , 通俗地说就是先将对纪录的更改操作暂时纪录在 change buffer ,待合适的时候再进行回刷回磁盘,提高更新操作的性能。
    官方文档描述
The change buffer is a special data structure that caches changes to secondary index pages when those pages are not in the buffer pool. The buffered changes, which may result from INSERT, UPDATE, or DELETE operations (DML), are merged later when the pages are loaded into the buffer pool by other read operations.
    通过上面的描述可以知道

  • change buffer 用于 secondary index
  • change buffer 用于 INSERT ,UPDATE ,DELETE 操作,并且将会在适当的时刻 merge,当出现的读操作的时候,数据会从磁盘加载进 buffer pool ,然后应用上 change buffer 。

Change Buffer 的例子 (来自 MySQL 45 讲)

假如我们执行以下的语句。

mysql> insert into t(id,k) values(id1,k1),(id2,k2);

分析这条更新语句,你会发现它涉及了四个部分:内存、redo log(ib_log_fileX)、 数据表空间(t.ibd)、系统表空间(ibdata1)。

这条更新语句做了如下的操作(按照图中的数字顺序):

  • Page 1在内存中,直接更新内存;

  • Page 2没有在内存中,就在内存的change buffer区域,记录下“我要往Page 2插入一行”这个信息

将上述两个动作记入redo log中(图中3和4)。

做完上面这些,事务就可以完成了。所以,你会看到,执行这条更新语句的成本很低,就是写了两处内存,然后写了一处磁盘(两次操作合在一起写了一次磁盘),而且还是顺序写的。

 select * from t where k in (k1, k2)

从图中可以看到:

  1. 读Page 1的时候,直接从内存返回。有几位同学在前面文章的评论中问到,WAL之后如果读数据,是不是一定要读盘,是不是一定要从redo log里面把数据更新以后才可以返回?其实是不用的。你可以看一下图3的这个状态,虽然磁盘上还是之前的数据,但是这里直接从内存返回结果,结果是正确的。

  2. 要读Page 2的时候,需要把Page 2从磁盘读入内存中,然后应用change buffer里面的操作日志,生成一个正确的版本并返回结果。

可以看到,直到需要读Page 2的时候,这个数据页才会被读入内存。

Change Buffer 如何工作

使用场景

针对写多读少的场景,因为写多的情况操作全都操作change buffer , 而假如想上面例子中的更改缓存在 change buffer , 下一刻 马上要进行读取,那么 change buffer 就失去了作用,因为我们读取的操作会从吃破案加载数据到 buffer pool .

Change Buffer 与 redo-log

** redo log 主要节省的是随机写磁盘的IO消耗(转成顺序写),而change buffer主要节省的则是随机读磁盘的IO消耗。 **

参考资料

  • MySQL45讲
  • https://dev.mysql.com/doc/refman/8.0/en/innodb-change-buffer.html (Change Buffer)

MySQL学习(六)change-buffer的更多相关文章

  1. MySQL学习(六)——自定义连接池

    1.连接池概念 用池来管理Connection,这样可以重复使用Connection.有了池,我们就不用自己来创建Connection,而是通过池来获取Connection对象.当使用完Connect ...

  2. MySql学习(六) —— 数据库优化理论(二) —— 查询优化技术

    逻辑查询优化包括的技术 1)子查询优化  2)视图重写  3)等价谓词重写  4)条件简化  5)外连接消除  6)嵌套连接消除  7)连接消除  8)语义优化 9)非SPJ优化 一.子查询优化 1. ...

  3. mysql存储引擎(mysql学习六)

    存储引擎 现在只有InnoDB支持外键 上接着学习笔记五 class表中有外键,所以不能修改存储引擎 表类型   默认的服务器表类型,通过my.ini可以配置    Default-storage-e ...

  4. MySQL学习(六)

    1 注意 select cout(*) from 表名: 查询的就是绝对的行数,哪怕某一列所有字段全部为NULL,也计算在内.而select cout(列名) form 表名:查询的是该列不为null ...

  5. 我的MYSQL学习心得(十六) 优化

    我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  6. mysql 原理 ~ change buffer

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

  7. 【大白话系统】MySQL 学习总结 之 缓冲池(Buffer Pool) 的设计原理和管理机制

    一.缓冲池(Buffer Pool)的地位 在<MySQL 学习总结 之 InnoDB 存储引擎的架构设计>中,我们就讲到,缓冲池是 InnoDB 存储引擎中最重要的组件.因为为了提高 M ...

  8. MySQL 数据库的提速器-写缓存(Change Buffer)

    写缓存(Change Buffer) 是一种特殊的数据结构,用于在对数据变更时,如果数据所在的数据页没有在 buffer pool 中的话,在不影响数据一致性的前提下,InnoDB 引擎会将对数据的操 ...

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

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

随机推荐

  1. idea中如何配置git以及在idea中初始化git,并push到码云

    一.给idea配置git 打开IDEA,按照路径  Fie-->Settings --> Tools -->Terminal 找到后设置右边的Shell path(自己安装的Git路 ...

  2. Costco这样的超级零售商,能不能干掉电商?

    名创优品创始人叶国富曾说过,Costco只是没有来到中国(大陆),如果它来了,中国现在的零售业全部都会"死光".叶国富的话,似乎一语成箴. 随着Costco正式入华,其正在彻底搅动 ...

  3. 回文串--Manacher算法(模板)

    用途:在O(n)时间内,求出以每一个点为中心的回文串长度. 首先,有一个非常巧妙的转化.由于回文串长度有可能为奇数也有可能为偶数,说明回文中心不一定在一个字符上.所以要将字符串做如下处理:在每两个字母 ...

  4. 第三章:使用ListView展示数据

    一.ImageList:存储图像集合 Images 存储的所有图像 ImageSize 图像的大小 ColorDepth 颜色数 TransparentColor 被视为透明的颜色 先设置ColorD ...

  5. selenium--find_element_by_xpath()方法汇总

    一.从根目录/开始 有点像Linux的文件查看,/代表根目录,一级一级的查找,直接子节点,相当于css_selector中的>号/html/body/div/p 二.根据元素属性选择: 查找具体 ...

  6. P1002 过河卒【dp】

    P1002 过河卒 题目描述 棋盘上AAA点有一个过河卒,需要走到目标BBB点.卒行走的规则:可以向下.或者向右.同时在棋盘上CCC点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制 ...

  7. 根据ID选中

    var name = document.getElementsById("mainStack");

  8. Pycharm常用快捷捷捷啊键= =

    超多快捷键的其实,懒得都记住(主要是记不住……) 这里记录一下自己觉得用了确实会很省事的,特别是当你没有鼠标的时候 = = 超常用的 Ctrl + /  注释该行 Ctrl + D  复制该行到下一行 ...

  9. Go生成随机数

    生成随机数 概念 伪随机数,都是根据一定的算法公式算出来的. 所在包 math/rand 生成随机数的公式需要一个种子数,一般为整数.种子数相同会导致每次启动程序是生成随机数相同,为了避免重复每次生成 ...

  10. javascript脚本混淆

    javascript脚本混淆  脚本病毒是一个一直以来就存在,且长期活跃着的一种与PE病毒完全不同的一类病毒类型,其制作的门槛低.混淆加密方式的千变万化,容易传播.容易躲避检测,不为广大网民熟知等诸多 ...