首页 > 数据库 >MySQL 的 Change Buffer 是什么?它有什么作用?

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

时间:2024-12-13 22:11:48浏览次数:4  
标签:Buffer 唯一 索引 内存 MySQL 磁盘 Change

MySQL 的 Change Buffer

1. 什么是 Change Buffer?

Change Buffer 是 MySQL InnoDB 存储引擎中的一个优化机制,用于减少磁盘 I/O 操作。它是一个专门用来缓存 非唯一二级索引变更操作 的内存区域,位于 InnoDB 的 Buffer Pool 中。

当对非唯一二级索引执行插入、更新或删除操作时,MySQL 并不会立即将这些变更写入磁盘,而是将变更记录存入 Change Buffer,稍后再合并到物理页面中。


2. Change Buffer 的作用

(1)减少磁盘 I/O

将索引页的变更操作缓存起来,避免频繁的随机磁盘读写操作,从而提升性能。

(2)提升写入性能

对于非唯一二级索引的修改操作:

  • 如果目标索引页已在内存中,直接更新内存中的页。
  • 如果目标索引页不在内存中,将变更写入 Change Buffer,延迟加载目标页,从而减少磁盘读取。

(3)批量合并

当后台线程或需要访问相关索引页时,MySQL 将 Change Buffer 的内容与实际的物理页面进行合并(称为 merge 操作)。这种批量合并可以提高效率。


3. Change Buffer 的适用场景

Change Buffer 仅适用于 非唯一二级索引 的修改操作:

  • 非唯一二级索引的插入(Insert Buffering)
  • 非唯一二级索引的更新(Delete-Mark Buffering 和 Insert Buffering)
  • 非唯一二级索引的删除(Delete Buffering)

主键索引和唯一索引 无法使用 Change Buffer,因为它们需要立即验证唯一性。


4. Change Buffer 的管理

(1)参数配置

innodb_change_buffer_max_size 用于控制 Change Buffer 占用 Buffer Pool 的比例(百分比),默认值为 25。

SET GLOBAL innodb_change_buffer_max_size = 50;

该参数的取值范围为 0 到 50,设置为 0 时禁用 Change Buffer。

(2)合并时机

Change Buffer 的合并操作发生在以下时机:

  • 查询需要访问相关索引页时。
  • 后台线程(如主线程)空闲时执行异步合并。
  • 数据页从磁盘加载到内存时。

(3)持久化

Change Buffer 的内容保存在系统表空间中,保证在 MySQL 重启后仍然有效。


5. Change Buffer 的优势

  1. 性能提升
    • 避免频繁的随机磁盘 I/O,提升插入和更新性能。
  2. 高效资源利用
    • 利用内存缓存变更,提高磁盘访问效率。
  3. 适用于批量写入场景
    • 批量插入、更新非唯一二级索引时,Change Buffer 的效果尤为显著。

6. Change Buffer 的限制

  1. 适用范围有限
    • 仅支持非唯一二级索引的修改,主键索引和唯一索引无法使用。
  2. 占用内存资源
    • Change Buffer 位于 Buffer Pool 中,占用一定内存资源,可能影响其他缓存的效率。
  3. 可能增加磁盘负载
    • 当 Change Buffer 内容较多时,后台合并操作会增加磁盘 I/O。

7. Change Buffer 的使用示例

创建非唯一二级索引

CREATE TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    age INT,
    INDEX (age)
) ENGINE=InnoDB;

对于 age 列上的非唯一二级索引插入操作:

  • 如果目标页不在内存中,变更会写入 Change Buffer,而不是立即加载索引页。
  • 后续访问或后台线程会将 Change Buffer 中的内容合并到磁盘页中。

8. 总结

  • Change Buffer 是 InnoDB 用于优化非唯一二级索引写入性能的重要机制。
  • 它通过将变更缓存在内存中,减少磁盘 I/O,提升写入性能。
  • 适用于大量插入、更新非唯一二级索引的场景,但需要注意内存和磁盘资源的平衡。

标签:Buffer,唯一,索引,内存,MySQL,磁盘,Change
From: https://www.cnblogs.com/eiffelzero/p/18605981

相关文章

  • 【MySQL数据基础】
    目录一、数据库概述1、数据库介绍2、数据库分类3、常见数据库介绍4、小结二、MySQL数据库1、MySQL介绍2、MySQL的特点3、MySQL版本4、MySQL数据库下载与安装5、添加环境变量(Windows)6、检测环境变量是否配置成功三、Linux系统下的MySQL安装与使用1、MySQL安装与使......
  • 【MySQL中多表查询和函数】
    目录1.多表查询1.1外键1.2链接查询2.MySQL函数内置函数简介数值函数字符串函数时间日期函数条件判断操作开窗函数1.多表查询本质:把多个表通过主外键关联关系链接(join)合并成一个大表,在去单表查询操作1.1外键外键概念:在从表(多方)创建一个字段,引用主表(一方)......
  • MySQL-基础-多表查询
    多表关系概述项目开发中,再进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:一对多(多对一)    案例:部门与员工的关系         ......
  • MySQL语句学习第四篇_数据库:通过intellij IDE连接MySQL数据库使用JDBC实现增删查改
    MySQL语句学习第四篇_数据库通过intellijIDE连接MySQL数据库使用JDBC来实现增删查改专栏记录MySQL的学习,感谢大家观看。本章的专栏......
  • MySQL之索引与事务
    一、索引索引是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的一列或多列创建索引,并指定索引的类型,各类索引有各自的数据结构实现。索引主要的目的是为了加快查找速度作用1、数据库中的表、数据、索引之间的关系,类似于书架上的图书、书籍内容和书......
  • spark读取hive和mysql的数据
    读取hive数据本质上:SparkSQL访问了Metastore服务获取了Hive元数据,基于元数据提供的地址进行计算启动以下服务:start-dfs.shstart-yarn.shmapred--daemonstarthistoryserver/opt/installs/spark/sbin/start-history-server.shhive-server-manager.shstartmetastore......
  • mysql将公司数据随机挂在部门身上
    1.创建示例数据CREATETABLEdepartment_table(company_codeVARCHAR(10)COMMENT'公司编码',company_nameVARCHAR(50)COMMENT'公司名称',department_codeVARCHAR(10)COMMENT'部门编码',department_nameVARCHAR(50)COMMENT'......
  • 利用MySQL和gin框架实现的留言板功能
    接口文档和详细代码看这里~前言本文将介绍一个基于Go语言和Gin框架实现的留言板系统。该系统支持用户注册、登录、发布留言、回复留言、关闭留言、获取所有留言等功能。本文将通过代码示例详细解读系统的结构、功能实现。结构本系统主要由以下几个模块构成:API:负责处理......
  • MySQL性能优化总结
    1. 数据库优化目的1.1. 避免出现页面访问错误1).由于数据库连接timeout产生页面5xx错误;2).由于慢查询造成页面无法加载;3).由于阻塞造成数据无法提交;1.2. 增加数据库的稳定性1).很多数据库的问题都是由于低效的查询引起的;1.3. 优化用户体验1).流畅页面的访问速度......
  • IO模型和mySQL缓冲
    ServletWebServerFactoryAutoConfigurationSpringApplicationRunListenerEventPublishingRunListener->通过SimpleApplicationEventMulticaster发布spring事件,持有List,调用onApplicationEventnewSpringApplication->setListeners((Collection)getSpringFactorie......