MySQL之Change Buffer详解

news2024/11/20 15:40:23

前言

本文已收录在MySQL性能优化+原理+实战专栏,点击此处浏览更多优质内容。

在这里插入图片描述上一篇文章一文带你了解MySQL数据库InnoDB_Buffer_Pool(点击跳转)我们学习了InnoDB Buffer Pool的工作原理,其作用是减少MySQL读取数据时直接与磁盘打交道的次数。那么写入数据时MySQL是否做了减少IO的优化呢?答案是肯定的,就要我们深入的学习Change Buffer。

先放一张官档中Change Buffer的架构图:

在这里插入图片描述

官档地址:https://dev.mysql.com/doc/refman/8.0/en/innodb-change-buffer.html
点击此处跳转

官档中对Change Buffer的概念是:更改缓冲区是一种特殊的数据结构,当二级索引页不在缓冲池中时,它将更改缓存到二级索引页。缓冲的更改可能来自INSERT、UPDATE或DELETE操作(DML),稍后当其他读操作将页面加载到缓冲池中时,这些更改将被合并。

目录

  • 一、如何减少因数据写入导致的IO?
  • 二、Change Buffer工作原理
    • 2.1 Change Buffer概念
    • 2.2 Change Buffer工作原理
  • 三、Change Buffer触发时机
  • 四、Change Buffer适用场景
    • 4.1 适合开启InnoDB的写缓冲机制
    • 4.2 不适合开启InnoDB的写缓冲机制
  • 五、Change Buffer的重要的参数
    • 5.1 innodb_change_buffer_max_size
    • 5.2 innodb_change_buffering
  • 六、Change Buffer相关监控信息

一、如何减少因数据写入导致的IO?

对于读请求,缓冲池能够减少与磁盘打交道的次数,提升性能。但是,如果写数据请求也能减少和磁盘打交道的次数,那样性能不是更好吗?

这时也分为两种情况:

  • 情况一:

    假如要修改的页4正好在缓冲池内

在这里插入图片描述
处理过程为图中1、2:

  • 直接修改缓冲池中的页,一次内存操作;
  • 写入redo log,一次磁盘顺序写操作;

这样的效率是最高的(像写日志这种顺序写,每秒几万次没问题)

是否会出现一致性问题呢?

并不会。
1、读取,会命中缓冲池的页;
2、缓冲池LRU数据淘汰,会将“脏页”刷回磁盘;
3、数据库异常奔溃,能够从redo log中恢复数据;

什么时候缓冲池中的页,会刷到磁盘上呢?

定期刷磁盘,而不是每次刷磁盘,能够降低磁盘IO,提升MySQL的性能。

  • 情况二:

    假如要修改的这个页40正好不在缓冲池内。

在这里插入图片描述
此时麻烦一点,处理过程为1、2、3:

  • 先把需要为40的索引页,从磁盘加载到缓冲池,一次磁盘随机读操作;
  • 修改缓冲池中的页,一次内存操作;
  • 写入redo log,一次磁盘顺序写操作;

没有命中缓冲池的时候,至少产生一次磁盘IO,对于写多读少的业务场景,是否还有优化的空间呢?

这即是InnoDB考虑的问题,写缓冲(change buffer)应用而生(从名字容易看出,写缓冲是降低磁盘IO,提升数据库写性能的一种机制)。

二、Change Buffer工作原理

2.1 Change Buffer概念

在MySQL5.5之前,叫插入缓冲(Insert Buffer),只针对INSERT做了优化;现在对DELETE和UPDATE也有效,叫做写缓冲(Change Buffer)。

它是一种应用在非唯一普通索引页(non-unique secondary index page)不在缓冲池中,对页进行了写操作,并不会立刻将磁盘页加载到缓冲池,而仅仅记录缓冲变更(Buffer Changes),等未来数据被读取时,再将数据合并(Merge)恢复到缓冲池中的技术。写缓冲的目的是降低写操作的磁盘IO,提升数据库性能。

为什么写缓冲优化,仅适用于非唯一普通索引页呢?
InnoDB里,聚集索引(Clustered Index))和普通索引(Secondary Index)存在异同。如果索引设置了唯一(Unique)属性,在进行修改操作时,InnoDB必须进行唯一性检查。也就是说,索引页即使不在缓冲池,磁盘上的页读取无法避免(否则怎么校验是否唯一),此时就应该直接把相应的页放入缓冲池再进行修改

2.2 Change Buffer工作原理

假如要修改页号为40的索引页,而这个页正好不在缓冲池内

在这里插入图片描述
加入写缓冲优化后,流程优化为:

  • 在写缓冲中记录这个操作,一次内存操作;
  • 写入redo log,一次磁盘顺序写操作;

其性能与这个索引页在缓冲池中,相近(可以看到,40这一页,并没有加载到缓冲池中)。

是否会出现一致性问题呢?

也不会。
数据库异常奔溃,能够从redo log中恢复数据
写缓冲不只是一个内存结构,它也会被定期刷盘到写缓冲系统表空间;
数据读取时,有另外的流程,将数据合并到缓冲池;

稍后的一个时间,有请求查询索引页40的数据

在这里插入图片描述
此时的流程如序号1-3:

  • 载入索引页,缓冲池未命中,这次磁盘IO不可避免;
  • 从写缓冲读取相关信息;
  • 恢复索引页,放到缓冲池LRU里;(可以看到,40这一页,在真正被读取时,才会被加载到缓冲池中)

三、Change Buffer触发时机

除了数据页被访问,还有这么几种情况,会刷写缓冲中的数据:

  • 有一个后台线程,会认为数据库空闲时;
  • 数据库缓冲池不够用时; 数据库正常关闭时;
  • redo log写满时;(几乎不会出现redo log写满,此时整个数据库处于无法写入的不可用状态)

四、Change Buffer适用场景

4.1 适合开启InnoDB的写缓冲机制

  • 数据库大部分是非唯一索引;
  • 业务是写多读少,或者不是写后立刻读取;

可以使用写缓冲,将原本每次写入都需要进行磁盘IO的SQL,优化定期批量写磁盘。例如,账单流水业务

4.2 不适合开启InnoDB的写缓冲机制

  • 数据库都是唯一索引;
  • 或者,写入一个数据后,会立刻读取它;

这两类场景,在写操作进行时(进行后),本来就要进行进行页读取,本来相应页面就要入缓冲池,此时写缓存反倒成了负担,增加了复杂度。

五、Change Buffer的重要的参数

mysql> show variables like '%innodb_change_buffer%';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| innodb_change_buffer_max_size | 25    |
| innodb_change_buffering       | all   |
+-------------------------------+-------+
2 rows in set (0.01 sec)

5.1 innodb_change_buffer_max_size

配置写缓冲的大小,占整个缓冲池的比例,默认25表示change buffer最大可以占用innodb buffer的25%,最大可设置的值为50%

 set persist innodb_change_buffer_max_size = 20

5.2 innodb_change_buffering

默认all表示所有的非唯一普通索引页写入都使用change buffer

  • all:所有的非唯一普通索引页写入
  • none:关闭change buffer
  • inserts:缓冲插入操作
  • deletes:缓冲删除操作
  • changes:缓冲插入和删除操作
  • purges:缓冲在后台发生的物理删除操作
set persist innodb_change_buffering=all;

六、Change Buffer相关监控信息

使用show engine innodb status \G命令查询

mysql> show engine innodb status \G;
**省略部分信息**
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
解读:
size 1:正在使用page
free list len:空闲的page
seg size:当前change buffer大小2*16K
merges:插入的条目

merged operations:
 insert 0, delete mark 0, delete 0
解读:
insert:通过change buffer插入的数目
delete mark:通过change buffer删除的数目
delete:通过change buffer purge的数目

discarded operations:
 insert 0, delete mark 0, delete 0
**省略部分信息**

change buffer的效果=merges/(insert+delete mark+delete)结果越小说明change buffer对性能提升越有利,也可以使用以下 select NAME,COUNT,MAX_COUNT,MIN_COUNT,AVG_COUNT,COMMENT from information_schema.innodb_metrics where name like '%ibuf%'语句进行监控

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/491766.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

百趣代谢组学党参远志散对记忆障碍大鼠学习能力和肠道菌群的影响

文章标题:Effects of Dangshen Yuanzhi Powder on learning ability and gut microflora in rats with memory disorde 发表期刊:Journal of Ethnopharmacology 影响因子:5.195 作者单位:山西中医药大学 百趣提供服务&#xf…

什么是元宇宙数字展厅?元宇宙前景如何 ?

元宇宙是一个近年来备受关注的概念,它被认为是未来数字世界的新形态。元宇宙是一个虚拟的、数字化的世界,它可以模拟现实世界的各种物理、社会和经济系统,同时也可以融合人工智能、虚拟现实等前沿技术,为用户提供更加丰富、多样化…

钴基双金属氧化物储能材料的高效制备和电化学应用

一、引言 钴金属氧化物作为一类典型的储能材料,既可以用于锂离子电池负极材料,又可以用于超级电容器电极材料,因而备受关注 。在作为锂离子电池负极材料时,具有较高的理论比容量,但充放电体积变化较大、材料导电性较差…

十、MyBatis的缓存

文章目录 十、MyBatis的缓存10.1 MyBatis的一级缓存场景1:判断同一个sqlSession是否查询1级缓存,答案:会查询1级缓存场景2:判断不同sqlSession是否查询1级缓存,答案:不会查询1级缓存场景3:判断相…

企业服务管理(ESM)工具

什么是企业服务管理 企业服务管理 (ESM) 是 IT 服务管理(ITSM)原则的延伸,旨在为人力资源 (HR)、法律、设施、营销和财务等业务团队提供更好的服务。ITSM 是 IT 团队管理向客户提供端到端 IT 服务的方式。ESM 的一个例子是建立一个可供整个组织所有团队使用的服务台…

LED显示屏周边设备

LED显示屏市场也呈多元化发展,异型屏、灯条屏、透明屏、小间距等应用新产品的出现无疑不是一种技术创新。以上创新技术的应用,对LED显示屏周边设备生产企业也提出了更高要求。因此,周边设备对推动整个LED显示屏的产业发展起着举足轻重、不可或…

【Linux-进程通信1】管道

🌈进程间通信介绍 🍄进程间通信目的 在操作系统中,每个进程都是独立运行的,它们有自己的地址空间和资源,它们不能直接访问其他进程的资源。然而,在现代计算机系统中,很少有一个进程能够独立完成…

yolov5读取单通道图像会怎样?

通过上图打印可知输入是固定3通道,那么意味着在读取图像中会对图像进行处理。 opencv在默认情况下会读取3个通道的图像,如果是灰度图会将图层复制三次(BGR缺省,BGR),因此读出来的图片是三通道。

xcode打包导出ipa

转载:xcode打包导出ipa 众所周知,在开发苹果应用时需要使用签名(证书)才能进行打包安装苹果IPA,作为刚接触ios开发的同学,只是学习ios app开发内测,并没有上架appstore需求,对于苹果…

【Mybatis】Mybatis之xml开发—用户角色权限关联案例

目录 要求:使用xml开发完成需求查询。 数据库 需求 要求:使用xml开发完成需求查询。 数据库 -- 用户表 create table sys_user(user_id int primary key auto_increment comment 用户ID,user_name varchar(50) comment 用户名,password varchar(32)…

软件测试——性能指标

登录功能示例: 并发用户数500; 响应时间2S; TPS到500; CPU不得超过75%; 性能指标有哪些? 响应时间 并发用户数 TPS CPU 内存 磁盘吞吐量 网络吞吐量 移动端FPS 移动端耗电量 APP启动时间 性能…

windows11 安装多个mysql8

安装一个mysql请参考:windows系统安装mysql8 解压缩版安装顺序_csdn_aspnet的博客-CSDN博客 下载mysql:MySQL :: Download MySQL Community Server 下载后解压到你指定的目录,我下载的非最新版,如图: 在文件夹下面建一…

【SpringMVC】| 控制器异常处理机制及实现流程

MVC目录 一. 🦁 前言二. 🦁 控制器异常处理Ⅰ. 单个控制器异常处理Ⅱ. 全局异常处理Ⅲ. 自定义异常处理 三. 🦁 最后 一. 🦁 前言 咱们来探索一下控制器异常处理流程,以及如何来实现它。 二. 🦁 控制器异…

烈日炎炎的夏天骑行,怎么预防中暑及中暑后怎么处理?

随着天气的逐渐炎热,夏季骑行逐渐成为了人们喜爱的一项运动。但是,在享受骑行乐趣的同时,我们也要时刻关注身体健康,预防中暑等意外情况的发生。下面,本文将从多个角度为大家讲解夏季骑行中暑的预防和处理方法。 一、选…

音频环回实验

音频环回实验 一、WM8978简介 WM8978是一个低功耗、高质量的立体声多媒体数字信号编译码器,它结合了一个高质量的立体声音DAC和ADC,带有灵活的音频线输入、麦克风输入和音频输出处理 WM8978内部有58个寄存器。每一个寄存器的地址位为7位,数…

SpringCloud基础知识

1、什么是SpringCloud SpringCloud分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体(微服务全家桶)。 查看官网:https://spring.io/ Spring Cloud本身不是新的框架,是一个全家桶式的技术栈&…

销售管理系统哪种好?

一、如何选择销售管理系统 销售管理软件其实就是我们常说的CRM软件,在激烈的市场竞争下,传统的销售管理模式不能满足有效跟进和及时维护客户的需求,在挖掘新客户和增强客户忠诚度方面也出现了一定弊端,因此销售管理软件应运而生&…

作者等级与权益说明

「创收计划」3.0上线,全面助力资源优质创作者 创:代表创作者收:代表收获 截止目前,文库资源频道已开放20细分领域,每个领域又进行详细的细分,在每个细分的品类上,我们已经收获了来自广大创作者…

基于AT89C51单片机的简易计算器的设计与仿真

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87755299?spm1001.2014.3001.5503 源码获取 本设计是以单片机AT89C51为核心的简易计算器设计,要通过芯片AT89C51实现计算器程序运行来完成加、减、乘…

python--读取TRMM-3B43月平均降水绘制气候态空间分布图(陆地区域做掩膜)

python–读取TRMM-3B43月平均降水绘制气候态空间分布图(陆地区域做掩膜) 成果展示 TRMM降水数据介绍 热带降雨测量任务(The Tropical Rainfall Measuring Mission,TRMM)是美国国家航空航天局(NASA)和日本国家太空发展署(National Space Dev…