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

概述

    文章将会介绍 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. vitualbox安装centos7卡死

    在用vitualbox安装centos7的时候,每次到配置页面,都会莫名卡死,试了几遍才发现不是卡死,而是弹窗用鼠标点击是没用的,需要用tab键和回车来选中执行.

  2. commons-dbutils实现增删改查(spring新注解)

    1.maven依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="h ...

  3. 为什么在linux系统下安装anaconda的时候会报错

    报错界面 一开始是在官网下载的最新的包,出现了上述的报错,但是换成清华镜像之后,就没有上述报错了? 我猜测可能是因为 官网最新的版本的anaconda和你安装的python版本不兼容,而在镜像上的不是 ...

  4. Dataset: online data

    From Kaggle: Appliances Energy Prediction Energy consumption of the Netherlands International Energy ...

  5. PP: Sequence to sequence learning with neural networks

    From google institution; 1. Before this, DNN cannot be used to map sequences to sequences. In this p ...

  6. 番外:可刷新PDB的管理操作(如何切换PDB Switching Over)

    基于版本:19c (12.2.0.3) AskScuti 主题:可刷新PDB如何进行切换操作 内容说明:本篇延续如何克隆可刷新的PDB(Refreshable PDB)一文,进行切换实验. 具体请参考 ...

  7. javaScript(Date与Math的API)

    目录 Math Math的两个属性值 E PI abs(); ceil(); floor(); round(); max(); min (); pow(); random sin(); cos(); ...

  8. C++记录(二)

    1.算术移位和逻辑移位. 逻辑移位是只补0,算术移位是看符号,负数补1,正数补0(讨论的是右移的情况下). 负数左移右边一样补0.如果遇到位运算的相关题目需要对int变量进行左移而且不知道正负,那么先 ...

  9. SpringBoot学习- 10、设计用户角色权限表

    SpringBoot学习足迹 前几节已经基本了解了SpringBoot框架常用的技术,其他的消息队列,定时器等技术暂时用不到,真正项目中如果基于微信系,阿里系开发的话,还要了解平台专用的技术知识,学习 ...

  10. STL-map-A - Let the Balloon Rise

    A - Let the Balloon Rise Contest time again! How excited it is to see balloons floating around. But ...