MySQL 的 Change Buffer 是什么?它有什么作用?

news2024/11/23 4:47:01

MySQL 的 Change Buffer 是什么?它有什么作用?

MySQL 是目前广泛使用的开源数据库管理系统,其中的 InnoDB 存储引擎凭借其高性能、高可靠性以及强大的事务支持,成为了默认的存储引擎。在 InnoDB 的众多优化机制中,Change Buffer 是一个相对较少被关注,但却在提升数据库性能方面发挥着重要作用的功能。


一.什么是 Change Buffer?

Change Buffer 是 MySQL InnoDB 存储引擎中的一个缓存机制,它用于缓存对 非主键索引(Secondary Indexes) 页的更改。这个缓存区的主要目的是延迟对这些索引页的写操作,以减少磁盘 I/O,从而提升数据库的写性能。

img

**简单来说,当我们对数据库中的二级索引执行插入、删除或更新操作时,这些操作并不会立即写入磁盘。**而是将它们先存放在 Change Buffer 中,直到相关的索引数据页被读取时,才会将这些更改刷写到磁盘。

为什么 Change Buffer 只对非唯一普通索引页有效?

Change Buffer 只对非唯一普通索引页有效,原因在于主键索引和唯一索引具有严格的数据一致性和唯一性要求,修改这些索引时通常涉及到数据行的完整更新或物理位置变化,这使得不能通过延迟写入来保证一致性。相反,非唯一普通索引的修改操作相对简单,且不直接影响行数据,因此适合通过 Change Buffer 缓存变更,减少磁盘 I/O 提高性能。主键索引通常更频繁地被查询和更新,直接写入磁盘可以确保数据的最新性,避免延迟写入引发的不一致问题。同时,限制 Change Buffer 仅应用于非唯一索引页,有助于更高效地利用内存资源,减少与主键索引频繁访问的内存竞争。因此,Change Buffer 的设计是基于数据一致性、性能优化和内存管理的综合考虑。

二.Change Buffer 的工作原理

InnoDB 存储引擎中的索引分为主键索引(Primary Index)和二级索引(Secondary Index)。Change Buffer 只作用于 二级索引,并不涉及主键索引。这是因为主键索引是聚簇索引,数据行按照主键排序存储,直接操作数据行,因此不适合使用延迟写入策略。

1. 对二级索引的操作: 更改暂存

在 InnoDB 中,二级索引是指那些非主键字段建立的索引。对于二级索引的 插入、删除和更新操作,InnoDB 会将这些修改记录到 Change Buffer 中,直到这些索引页被访问时,才会将更改刷写到磁盘。只有当磁盘中的二级索引数据页被访问(例如查询操作),或当系统触发数据页刷写操作时,这些更改才会真正写入磁盘。

2. 如何实现延迟写入:合并更改

Change Buffer 工作时的延迟写入机制主要依赖于 脏页(Dirty Pages) 的概念。在内存中,Change Buffer 会维护一份待刷写的脏页列表,这些脏页记录了尚未写入磁盘的索引更改。当某个二级索引页被访问时,InnoDB 会首先检查该页是否有尚未刷写的更改,如果有,就将更改合并到磁盘数据页中。

3. **与 Redo Log 的配合:**刷新到磁盘

Change Buffer 与 InnoDB 的 Redo Log 协同工作。在数据库崩溃恢复时,Redo Log 会确保所有已提交的事务操作能够恢复。对于那些还没有写入磁盘的数据变更,Change Buffer 会通过 Log Buffer 在系统恢复时被重做,以确保数据的一致性。

4.对旧数据的处理:定期清理

随着时间的推移,Change Buffer中的数据可能会老化或不再需要。为了保持Change Buffer的使用效率,InnoDB会定期执行清理过程,移除那些已经过时或不再需要的更改操作信息。

当我们要更新一条普通索引记录的时候:

  1. 如果这条记录在内存中,那么直接更新内存
  2. 如果该记录没有在内存中,那么就需要更新change buffer
  3. 更新完 change buffer 之后,MySQL会在redo log中记录下change buffer 的修改
  4. 事务就算完成了,后续binlog落盘,redo log commit
  5. 当需要读取不在内存中的记录时,会将该数据页从磁盘加载到内存,然后应用change buffer中的修改,也就是merge操作

三.如何触发Change Buffer

Change Buffer的触发时机主要是在非主键索引的更新或删除操作时。当对一个非主键索引的记录进行更改时,这些更改操作首先会被暂存到Change Buffer中。以下是Change Buffer触发的具体时机:

  1. 非主键索引的更新操作: 当一个非主键索引的记录被更新时,Change Buffer会触发并将更改操作暂存到内存中。

  2. 非主键索引的删除操作: 当一个非主键索引的记录被删除时,Change Buffer同样会触发并将该删除操作暂存到内存中。

  3. 数据页读取操作: 当从非主键索引页读取数据时,Change Buffer会检查该页是否在Change Buffer中有相关的更改。如果有,它会将这些更改应用到该页上,确保读取的数据是最新的。

需要注意的是,Change Buffer触发的时机并不是在每次数据更改时都立即触发。而是将这些更改暂存到内存中的Change Buffer区域,并在合适的时机(如数据页读取操作时)再将这些更改应用到相应的数据页上。这样可以减少频繁的磁盘I/O操作,提高数据库的性能。

此外,Change Buffer的使用时机也受到一些参数和配置的影响。例如,可以通过调整InnoDB存储引擎的相关参数来控制Change Buffer的行为和触发条件。在实际应用中,需要根据具体的业务场景和性能需求进行合理的配置和优化。

四.数据库崩溃时 Change Buffer 的行为

当 MySQL 数据库发生崩溃或停止运行时,InnoDB 会通过 Crash Recovery 机制来恢复数据库。Change Buffer 中的变更不会丢失,InnoDB 会在恢复过程中利用 Redo Log 重新应用这些未写入磁盘的更改。

具体而言:

  • Change Buffer 中存储的变更(如插入、删除等)会在数据库崩溃恢复时被合并到相关的二级索引数据页。
  • 恢复时,InnoDB 会检查并重新应用所有记录在 Change Buffer 中的更改,确保它们正确地反映在数据库的磁盘存储中。

五.Change Buffer 的优缺点

优点:
  1. 减少磁盘 I/O: Change Buffer 可以有效减少每个数据页的磁盘 I/O 操作,提升数据库性能。
  2. 提高写入吞吐量: 延迟写入机制提高了系统的写操作吞吐量,尤其在高并发场景下表现尤为突出。
  3. 减少写放大效应: 多个修改操作可以批量处理,从而减少磁盘的写放大效应。
缺点:
  1. 内存占用: Change Buffer 会占用一定的内存资源,若系统内存不足,可能会影响性能。
  2. 延迟性: 虽然 Change Buffer 可以提升写入性能,但它也引入了延迟,特别是在需要实时反映数据更改的应用中,可能不是最佳选择。

六.如何管理 Change Buffer?

InnoDB 提供了几个参数来管理 Change Buffer 的大小和行为,常用的包括:

  • innodb_change_buffer_max_size:这个参数设置 Change Buffer 的最大大小,默认值是 25%,即最多占用 InnoDB 缓存池的 25%。
  • innodb_change_buffering:此参数控制哪些操作可以使用 Change Buffer。可以设置为 none(禁用 Change Buffer)、insert(仅插入操作使用 Change Buffer)或 all(所有修改操作都使用 Change Buffer)。
  • innodb_change_buffer_free_percent: 这个参数定义了Change Buffer中保留给将来更改的空间百分比。当Change Buffer的使用率达到这个百分比时,InnoDB会开始将一些更改写入到磁盘上的重做日志中。

总结

MySQL 的 Change Buffer 是 InnoDB 存储引擎中的一个优化机制,它通过将对二级索引的修改操作延迟到数据页被访问时才写入磁盘,显著减少了磁盘 I/O,提升了数据库的写入性能和并发能力。对于高并发、高写入负载的数据库应用,Change Buffer 能有效降低磁盘访问压力,提高系统吞吐量。

数据页被访问时才写入磁盘,显著减少了磁盘 I/O,提升了数据库的写入性能和并发能力。对于高并发、高写入负载的数据库应用,Change Buffer 能有效降低磁盘访问压力,提高系统吞吐量。

然而,Change Buffer 并非没有缺点。它增加了内存占用,并且由于延迟写入,可能会导致某些实时应用对数据一致性的要求受到影响。因此,理解 Change Buffer 的作用和管理策略,可以帮助开发者在实际应用中合理配置和优化数据库性能。

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

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

相关文章

axios 请求跨域问题

文章目录 1. 使用场景2. 解决办法 1. 使用场景 ① 编写后端测试接口&#xff0c;Vue-CLI 的默认端口为 8080&#xff0c;所以为避免端口冲突&#xff0c;我们后端的端口号换成 8081。 ② 前端通过 axios 向后端服务发起请求。 <script> import axios from axios export…

VConsole——(H5调试工具)前端开发使用于手机端查看控制台和请求发送

因为开发钉钉H5微应用在手机上一直查看不到日志等&#xff0c;出现安卓和苹果上传图片一边是成功的&#xff0c;一边是失败的&#xff0c;所以找了这个&#xff0c;之前在开发微信小程序进行调试的时候能看到&#xff0c;之前没想到过&#xff0c;这次被人提点发现可以单独使用…

集合卡尔曼滤波(Ensemble Kalman Filter),用于二维滤波(模拟平面上的目标跟踪),MATLAB代码

集合卡尔曼滤波&#xff08;Ensemble Kalman Filter&#xff09; 文章目录 引言理论基础卡尔曼滤波集合卡尔曼滤波初始化预测步骤更新步骤卡尔曼增益更新集合 MATLAB 实现运行结果3. 应用领域结论 引言 集合卡尔曼滤波&#xff08;Ensemble Kalman Filter, EnKF&#xff09;是…

写给Vue2使用者的Vue3学习笔记

&#x1f64b;‍请注意&#xff0c;由于本人项目中引入了unplugin-auto-import的依赖&#xff0c;所以所有的代码示例中均未手动引入各种依赖库&#xff08;ref、reactive、useRouter等等&#xff09; 初始环境搭建 npm init vuelatest模板语法 插值 同 Vue2 <span>…

golang调用webview,webview2,go-webview2

go version go1.20 windows/amd64 先要了解一些第三方库 1、webview/webview 它是一个跨平台的轻量级的webview库&#xff0c;面向的是C/C&#xff0c;使用它可以构建跨平台的GUI。webview就是浏览器内核&#xff0c;在不同操作系统上是不同的库&#xff0c;比如在windows上…

【初阶数据结构篇】双向链表的实现(赋源码)

文章目录 须知 &#x1f4ac; 欢迎讨论&#xff1a;如果你在学习过程中有任何问题或想法&#xff0c;欢迎在评论区留言&#xff0c;我们一起交流学习。你的支持是我继续创作的动力&#xff01; &#x1f44d; 点赞、收藏与分享&#xff1a;觉得这篇文章对你有帮助吗&#xff1…

结合第三方模块requests,文件IO、正则表达式,通过函数封装爬虫应用采集数据

#引用BeautifulSoup更方便提取html信息&#xff1b;requests模块&#xff0c;发生http请求&#xff1b;os模块&#xff0c;文件写入import requests from bs4 import BeautifulSoup import os#当使用requests库发送请求时&#xff0c;如果不设置User - Agent&#xff0c;默认的…

开源许可协议

何同学推动了开源协议的认识&#xff0c;功不可没&#xff0c;第一次对开源有了清晰的认识&#xff0c;最宽松的MIT开源协议 源自OSC开源社区&#xff1a;何同学使用开源软件“翻车”&#xff0c;都别吵了&#xff01;扯什么违反MIT

【达梦数据库】主备集群改造成读写分离

目录 背景步骤1、确认授权2、参数修改3、确认驱动版本和数据库版本匹配 背景 客户在双机主备集群手动切换的环境下&#xff0c;发现主库压力较大&#xff0c;需要改成读写分离的模式&#xff0c;将主库的压力分担到备库。 步骤 1、确认授权 select * from v$license;授权使…

docker安装zabbix +grafana

安装zabbix grafana 1、部署 mkdir -p /opt/zabbix/{data,backups}mkdir -p /opt/grafanasudo chown -R 472:472 /opt/grafanasudo chmod -R 755 /opt/grafanacat > docker-compose.yml <<-EOF version: 3.3services:mysql-server:image: mysql:8.1container_name: m…

RocketMQ学习记录

服务器操作系统版本&#xff1a;Ubuntu 24.04 Java版本&#xff1a;21 Spring Boot版本&#xff1a;3.3.5 如果打算用GUI&#xff0c;虚拟机安装Ubuntu 24.04&#xff0c;见虚拟机安装Ubuntu 24.04及其常用软件(2024.7)_ubuntu24.04-CSDN博客https://blog.csdn.net/weixin_4…

网络安全之接入控制

身份鉴别 ​ 定义:验证主题真实身份与其所声称的身份是否符合的过程&#xff0c;主体可以是用户、进程、主机。同时也可实现防重放&#xff0c;防假冒。 ​ 分类:单向鉴别、双向鉴别、三向鉴别。 ​ 主题身份标识信息:密钥、用户名和口令、证书和私钥 Internet接入控制过程 …

Spring 框架七大模块(Java EE 学习笔记03)

​ ​核心容器模块&#xff08;Core Container&#xff09; 核心容器模块在Spring的功能体系中起着支撑性作用&#xff0c;是其他模块的基石。核心容器层主要由Beans模块、Core模块、Contex模块和SpEL模块组成。 &#xff08;1&#xff09;Beans模块。它提供了BeanFactory类&…

IPv6基础知识

IPv6是由IEIF提出的互聯網協議第六版&#xff0c;用來替代IPv4的下一代協議&#xff0c;它的提出不僅解決了網絡地址資源匱乏問題&#xff0c;也解決了多種接入設備接入互聯網的障礙。IPv6的地址長度為128位&#xff0c;可支持340多萬億個地址。如下圖&#xff0c;3ffe:1900:fe…

旷世yolox自定义数据训练和验证和onnx导出推理

目录 1.前言 2.代码 3.环境 4.自定义数据形态 5.配置文件 6.训练 7.验证 8.评估混淆矩阵 9.导出onnx 10.onnx推理 -- 补充&#xff1a;docker环境 1.前言 旷世科技的yolox比较清爽&#xff0c;效果也不错&#xff0c;简单总结主要有三点创新比较高&#xff1a;deco…

Electron开发构建工具electron-vite(alex8088)添加VueDevTools(VitePlugin)

零、介绍 本文章的electron-vite指的是这个项目&#x1f449;electron-vite仓库&#xff0c;electron-vite网站 本文章的VueDevTools指的是VueDevTools的Vite插件版&#x1f449;https://devtools.vuejs.org/guide/vite-plugin 一、有一个用electron-vite创建的项目 略 二、…

软件测试—— Selenium 常用函数(一)

前一篇文章&#xff1a;软件测试 —— 自动化基础-CSDN博客 目录 前言 一、窗口 1.屏幕截图 2.切换窗口 3.窗口设置大小 4.关闭窗口 二、等待 1.等待意义 2.强制等待 3.隐式等待 4.显式等待 总结 前言 在前一篇文章中&#xff0c;我们介绍了自动化的一些基础知识&a…

UE5 腿部IK 解决方案 footplacement

UE5系列文章目录 文章目录 UE5系列文章目录前言一、FootPlacement 是什么&#xff1f;二、具体实现 前言 在Unreal Engine 5 (UE5) 中&#xff0c;腿部IK&#xff08;Inverse Kinematics&#xff0c;逆向运动学&#xff09;是一个重要的动画技术&#xff0c;用于实现角色脚部准…

私有化部署视频平台EasyCVR宇视设备视频平台如何构建视频联网平台及升级视频转码业务?

在当今数字化、网络化的时代背景下&#xff0c;视频监控技术已广泛应用于各行各业&#xff0c;成为保障安全、提升效率的重要工具。然而&#xff0c;面对复杂多变的监控需求和跨区域、网络化的管理挑战&#xff0c;传统的视频监控解决方案往往显得力不从心。 EasyCVR视频融合云…

山东春季高考-C语言-综合应用题

&#xff08;2018年&#xff09;3.按要求编写以下C语言程序&#xff1a; &#xff08;1&#xff09;从键盘上输入三个整数a、b、c&#xff0c;判断能否以这三个数为边构成三角形&#xff0c;若可以则计算机三角形的面积且保留两位小数&#xff1b;若不可以则输出“不能构成三角…