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,提升写入性能。
  • 适用于大量插入、更新非唯一二级索引的场景,但需要注意内存和磁盘资源的平衡。

MySQL 的 Change Buffer 是什么?它有什么作用?的更多相关文章

  1. mysql 原理 ~ change buffer

    一 简介:今天咱们来聊聊mysql的change buffer二 详细说明   1 +-change Buffer和数据页一样,也是物理页的一个组成部分,数据结构也是一颗B+树,这棵B+树放在共享表空 ...

  2. MySQL:change buffer

    1. 概念 Innodb维护了一个缓存区域叫做Buffer Pool,用来缓存数据和索引在内存中.其大小通过参数 innodb_buffer_pool_size 控制: change buffer 是 ...

  3. 全网最清楚的:MySQL的insert buffer和change buffer 串讲

    目录 一.前言 二.问题引入 2.1.聚簇索引 2.2.普通索引 三.change buffer存在的意义 四.再看change buffer 五.change buffer 的限制 六.change ...

  4. MySQL -- Innodb中的change buffer

    change buffer是一种特殊的数据结构,当要修改的辅助索引页不在buffer pool中时,用来cache对辅助索引页的修改.对辅助索引页的操作可能是insert.update和delete操 ...

  5. Mysql InnoDB三大特性-- change buffer

    Mysql InnoDB三大特性-- change buffer

  6. 【MySQL 5.7 Reference Manual】15.4.2 Change Buffer(变更缓冲)

    15.4.2 Change Buffer(变更缓冲)   The change buffer is a special data structure that caches changes to se ...

  7. MySQL 5.7 Reference Manual】15.4.2 Change Buffer(变更缓冲)

    15.4.2 Change Buffer(变更缓冲)   The change buffer is a special data structure that caches changes to se ...

  8. mysql小特性:change buffer

    change buffer是在其他数据库中没有的一个概念,说白了就是一块系统表空间分配的空间,针对的对象是辅助索引的叶子节点(为什么不是主键索引?因为主键索引是聚集索引,在磁盘上的排列是有序的,磁盘的 ...

  9. MySql 缓冲池(buffer pool) 和 写缓存(change buffer) 转

    应用系统分层架构,为了加速数据访问,会把最常访问的数据,放在缓存(cache)里,避免每次都去访问数据库. 操作系统,会有缓冲池(buffer pool)机制,避免每次访问磁盘,以加速数据的访问. M ...

  10. MySQL 数据库的提速器-写缓存(Change Buffer)

    写缓存(Change Buffer) 是一种特殊的数据结构,用于在对数据变更时,如果数据所在的数据页没有在 buffer pool 中的话,在不影响数据一致性的前提下,InnoDB 引擎会将对数据的操 ...

随机推荐

  1. ctfshow--web4 include日志注入

    这题和第三题有点不一样,这题的把php 和 data 都过滤掉了 一旦我们输入这个关键字就页面就会报error 一开始是没啥头绪的,后面上网查了一下,可以通过日志记录来注入代码 对于Apache,日志 ...

  2. 一个9年archlinux重度使用者自述

    系统没有高低贵贱,主要还是使用的人,哪个跟你更契合.对我而言, archlinux就是最契合的那个.本文主要是对archlinux使用做一个粗浅的介绍,如果能勾起你一丝兴趣,那就更好了. 第一部分:初 ...

  3. Nodify学习 三:连接器

    前置 连接概述 连接是由两个点之间创建的.Source和Target依赖属性是Point类型,通常绑定到连接器的Anchor点. 基本连接 库中所有连接的基类是BaseConnection,它派生自S ...

  4. Vmware共享文件夹安装设置方法(window与Linux使用共享文件夹)

    Vmware共享文件夹安装设置方法 注意:如果按照了工具,设置了共享文件夹,Linux下面还是没有的话,可以运行下面的命令,就会加载共享文件夹了 vmhgfs-fuse .host:/ /mnt/hg ...

  5. 舞台已就位!坐等AI玩家集结!

    舞台已就位!坐等AI玩家集结!

  6. Github 访问失败,问题修复

    参考学习链接: https://www.cnblogs.com/MuQuanyu-YuGod/articles/12549766.html Github 网站无法访问的解决方法: 解决方案: Cd到文 ...

  7. WPF程序性能优化总结

    原文链接: https://blog.csdn.net/u010265681/article/details/77571947 WPF程序性能由很多因素造成,以下是简单地总结: 元素: 1. 减少需要 ...

  8. 给大模型添加联网功能的免费方案,以langchain为例

    langchain介绍 LangChain 是一个用于开发由大型语言模型 (LLM) 驱动的应用程序的框架. 简单来说,它可以帮助你更轻松地构建利用 LLM(例如 OpenAI 的 GPT 模型.Go ...

  9. Go1.24版本终于来了!各位开发者,准备好迎接这些激动人心的新功能了吗?让我们一起来探讨下Go1.24中有哪些精彩的亮点?

    前言 Gopher们,Go 1.24.0 正式发布了!与 Go 1.23.0 相比,这个版本带来了众多改进.让我们一同看看 Go 1.24.0 都有哪些新变化吧! 在 Windows 下,请在 htt ...

  10. FastAPI 路径参数完全指南:从基础到高级校验实战 🚀

    title: FastAPI 路径参数完全指南:从基础到高级校验实战 date: 2025/3/5 updated: 2025/3/5 author: cmdragon excerpt: 探讨 Fas ...