一文了解MySQL写缓冲Change Buffer(定义 作用 执行过程 触发时机 业务场景)

MySQL的数据存储包含内存与磁盘两个部分,内存缓冲区buffer pool以页为单位,缓存最热的数据页data page与索引页index page,InnoDB以变种LRU算法管理缓冲池,并且解决了预读失效和缓冲池污染的问题。对于读请求,缓冲池可以减少磁盘IO,提升性能,那么写请求呢?

思考2个场景:

场景1:假设要修改页号为4的索引页,这个页恰好在缓冲池里,那么修改的步骤为:

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

这样效率高,而且写日志这种顺序写,每秒可以支持上万的并发量

一致性问题也不会出现,如果读取的时候,命中缓冲池的页;缓冲池通过LRU后淘汰了数据,会将正确数据刷回磁盘;数据库异常崩溃,redo log里恢复的数据也没问题。

那么缓冲池的页什么时候会刷到磁盘上呢?定期刷磁盘,通过批量写的方式降低磁盘IO

场景2:修改页号为100的索引页,这个页不在缓冲池里,修改的步骤为:

  • 先把序号为100的索引页从磁盘加入到缓冲池里,一次磁盘随机读操作
  • 修改缓冲池的页,一次内存操作
  • 写入redo log,一次磁盘顺序写操作

没有命中缓冲池的时候,至少产生一次磁盘IO,对于写多读少的业务场景,还有优化的空间,也就是写缓冲 change buffer,是降低磁盘IO,提升数据库写性能的一种机制。

定义和作用

写缓冲Change Buffer是InnoDB为了提高非主键索引操作性能而引入的一种机制。当对非唯一索引进行更改(如插入、更新、删除操作)时,如果对应的数据页不在缓冲池(Buffer Pool)中,InnoDB不会立即从磁盘读取数据页,而是将这些更改操作缓存到Change Buffer中,等未来数据被读取时,再将数据合并merge恢复到缓冲池中。这样做的目的是为了减少对磁盘的I/O操作,从而提高数据库的整体性能。

执行过程

还是以刚刚的场景2为例,修改页号为100的索引页,这个页不在缓冲池里,加入写缓冲后修改的步骤为:

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

性能与 场景1相近

对于数据一致性问题,也不会出现。数据库异常崩溃的时候,可以从redo log里恢复数据;写缓冲也会被定期刷盘到写缓冲系统表空间;数据读取的时候,将数据合并到缓冲池。

当稍后有请求查询索引页100的数据时,流程如下:

  • 缓冲池未命中,从磁盘里载入索引页
  • 从写缓冲读取相关信息
  • 恢复索引页,放入缓冲池

整个写缓冲的执行过程可以总结如下:

  1. 更改暂存:非主键索引的记录被更新或删除时,这些更改操作首先被暂存到Change Buffer中
  2. 合并更改:当数据页从磁盘上读取到内存中时,Change Buffer中的相关信息会被用来合并这些更改,即应用到对应的缓存数据页中。
  3. 刷新到磁盘:Change Buffer中的更改操作最终会被刷新到磁盘上,以保持数据的一致性。
  4. 清理过程:InnoDB会定期执行清理过程,移除那些已经过时或不再需要的更改操作信息。

触发时机

  1. 非主键索引的更新操作:当一个非主键索引的记录被更新时,Change Buffer会触发并将更改操作暂存到内存中
  2. 非主键索引的删除操作:当一个非主键索引的记录被删除时,Change Buffer同样会触发并将该删除操作暂存到内存中。
  3. 数据页读取操作:当从非主键索引页读取数据时,Change Buffer会检查该页是否在Change Buffer中有相关的更改。如果有,它会将这些更改应用到该页上,确保读取的数据是最新的。

思考一个问题:为什么写缓冲优化,只适用于二级索引?

如果索引设置了唯一unique属性,在修改操作时,InnnoDB必须进行唯一性检查。索引页即使不在缓冲池里,磁盘上的页读取也是要进行的,因为要检验是否唯一,这里就会把相应的页直接放入缓冲池再修改,无需写缓冲。

刷数据时机

上面提到了如果数据页被访问,写缓冲的数据就会被刷新,除此之外,还有下面几种场景:

  • 后台线程认为数据库空闲时
  • 数据库缓冲池不够用
  • 数据库正常关闭
  • redo log写满 (这时整个数据库都处于无法写入的不可用状态)

优缺点

优点:减少随机磁盘I/O,提高写入操作的性能,特别是对于写密集型操作。

缺点:仅适用于非唯一普通索引页,且在随机读负载时效果可能不佳。

业务场景

不适合的业务场景:

  • 数据库都是唯一索引
  • 写入数据后立刻读取:因为写操作进行后,本来就要立刻进行页读取,需要从磁盘里将这个页面载入缓冲池,这时还用写缓冲多此一举

适合的业务场景:

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

配置

innodb_change_buffer_max_size:配置写缓冲的大小占整个缓冲区的比例,默认25%,最大50%

innodb_change_buffering:配置哪些写操作启用写缓冲,取值为all/none/inserts/deletes

  • Change Buffer中包含的操作主要有三种:插入缓冲(Insert Buffer)、删除缓冲(Delete Buffer)和更新缓冲(Update Buffer)

对比

写缓冲与Redo Log的关系: 写缓冲用于暂存对二级索引页的修改,而Redo Log记录了对数据的所有修改操作,包括主键索引和二级索引,以保证数据的持久性和一致性

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

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

相关文章

Python内存泄漏 —— 宏观篇

Python内存泄漏 —— 宏观篇 应该弄清楚哪些问题 内存情况如何,是否一直增长?哪些是异常对象?这类对象占总内存多大比例?异常对象为何泄漏?如何使其正常释放?如何确定异常对象正常释放了?如何…

Chromium CDP 开发(五):注册自己的指令(中)

引言 在前一篇文章中,我们已经了解了 PDL(Protocol Description Language)的基本功能以及如何在其中声明 CDP(Chrome DevTools Protocol)指令和事件的具体内容。接下来,我们将深入探讨如何在实际开发中进行…

回溯算法解决全排列问题

1. 问题描述 定义:给定一个不含重复数字的数组 nums ,返回其所有可能的全排列 。 示例: 输入数组 [1, 2, 3] 输出结果应该为: leetcode 地址 2. 代码实现 package com.ztq.algorithm.BackTrack;import java.util.List; impo…

金融行业 IT 实践|某信托公司:从虚拟化到容器平台的 VMware 替代与双活建设实践

随着“VMware 替代” 在金融行业的快速推进,不少金融用户的替代进程已逐渐从存储、虚拟化过渡到容器平台层面,实现更为全面的 VMware 国产化替代与架构升级。其中,某信托用户在使用 SmartX 超融合(采用 VMware 虚拟化和 Tanzu 容器…

python学习——格式化字符串

在Python中,格式化字符串是一种将变量插入到字符串中的方法,使得字符串的构建更为灵活和方便。以下是一些常见的格式化字符串的方法: 文章目录 1. 使用百分号 % 格式化2. 使用 str.format() 方法3. 使用 f-string (格式化字符串字面量)格式说…

【上线文档】系统上线方案模板,计算机系统上线保障计划,系统运维信息系统运行保障方案,系统上线方案模板(Word原件)

一、项目背景和目标 二、项目需求分析 2.1 功能需求 2.2 非功能需求 三、系统设计 3.1 系统架构设计 3.2 数据库设计 3.3 接口设计 3.4 用户界面设计 四、系统开发 4.1 开发环境搭建 4.2 业务逻辑开发 4.3 数据库实现 4.4 接口实现 4.5 用户界面实现 五、系统测…

MySQL索引再认识

在最近的一次MySQL测试过程中,我的同事幺加明遇到了一些令人困惑的现象,这些现象超出了我们最初的预期。一直以来,我们在建立索引时,首要考虑的原则是在区分度大的字段上建立索引。然而,在实际测试中,我们发…

SQL靶场第一关

打开sql靶场 一.判断注入类型 在网址输入?id1,页面正常回显 我们在输入?id1,页面报错,说明存在sql注入 我们再输入?id1 and 11--,页面正常回显 我们在输入?id1 and 12--,页面没有回显 这里我们知道了是字符型注入 为什么是…

ollama运行qwen2.5-coder:7b

1.linux安装 curl -fsSL https://ollama.com/install.sh | sh ollama serve # 启动ollama ollama create # 从模型文件创建模型 ollama show # 显示模型信息 ollama run # 运行模型,会先自动下载模型 ollama pull # 从注册仓库中拉取模…

牛客——打印日期,日期累加(C++)

目录 1.日期累加 1.1题目描述 1.2思路 1.3 2.打印日期 2.1题目描述 2.2思路 2.3代码 1.日期累加 1.1题目描述 计算一个日期加上若干天后是什么日期。输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。输出m行,每行按…

Stylus 浏览器扩展开发-Cursor AI辅助

项目起源 作为一个经常需要长时间盯着屏幕的开发者,我一直在寻找一个简单的方法来保护眼睛。最初的想法很简单:将网页背景色替换成护眼的豆沙绿。虽然市面上已经有类似的扩展,但我想要一个更加轻量且可定制的解决方案。 这个简单的需求逐渐…

AD20 原理图库和PCB库添加

一 点击右下角 二 点击Components 三 点击File-based Libraries Preferences 四 最后点击安装即可

微信小程序uni-app+vue3实现局部上下拉刷新和scroll-view动态高度计算

微信小程序uni-appvue3实现局部上下拉刷新和scroll-view动态高度计算 前言 在uni-appvue3项目开发中,经常需要实现列表的局部上下拉刷新功能。由于网上相关教程较少且比较零散,本文将详细介绍如何使用scroll-view组件实现这一功能,包括动态高度计算、下拉刷新、上拉加载等完整…

针对边缘计算优化LoRa的TinyML信道跳变管道

论文标题:Optimizing LoRa for Edge Computing with TinyML Pipeline for Channel Hopping(针对边缘计算优化LoRa的TinyML信道跳变管道) 作者信息:Marla Grunewald, Mounir Bensalem 和 Admela Jukan,来自德国布伦瑞克…

Linux-USB驱动实验

USB 是很常用的接口,目前大多数的设备都是 USB 接口的,比如鼠标、键盘、USB 摄像头等,我们在实际开发中也常常遇到 USB 接口的设备,本章我们就来学习一下如何使能 Linux内核自带的 USB 驱动。注意!本章并不讲解具体的 …

操作系统文件管理相关习题2

文件管理的任务和功能文件管理 任务:对用户文件和系统文件进行组织管理,以方便用户使用,并保证文件的安全 功能:文件存储空间的管理,目录管理,文件读写管理和保护 目录管理 对目录管理的要求 实现按名存…

MYSQL - 索引详解

一 什么是索引? 实际上在上一篇介绍MYSQL的体系结构当中我们稍微提及了一点,在引擎层,我们提到不同的引擎对应的索引的实现方式,选择是不一样的。 简单理解,索引(index)其实就是一种帮助MYSQL高…

AI智能体Prompt预设词指令大全+GPTs应用使用

AI智能体使用指南 直接复制在AI工具助手中使用(提问前) 可前往SparkAi系统用户官网进行直接使用 SparkAI系统介绍文档:Docs 常见AI智能体GPTs应用大全在线使用 自定义添加制作AI智能体进行使用: 文章润色器 你是一位具有敏锐洞察…

el-tree树形结构拖拽层级错乱问题

背景: 项目中有个文件夹树形菜单,并且各级菜单中的子级元素是可以任意拖拽的,也就是树形结构拖拽修改分组。 问题分析: 出现拖拽层级错乱的问题,这通常意味着在进行节点拖拽操作后,树的层级关系没有正确地被维护。这可能是因为在更新节点位…

线程和进程(juc)

线程 一:概念辨析 1:线程与进程 进程: 1:程序由指令和数据组成,指令要执行,数据要读写,就需要将指令加载给cpu,把数据加载到内存,同时程序运行时还会使用磁盘&#x…