InnoDB原理篇:Change Buffer是如何提升索引性能的?

MySQL的InnoDB的change buffer:如何利用它提高DML操作的性能并处理辅助索引写入? 简单来说,Change Buffer是一个特殊的存储区域,位于InnoDB的系统表空间中。它的作用是。 阅读详情

相信很多小伙伴设计索引时,考虑更多的是 索引是否能覆盖大部分的业务场景 ,却忽略了 索引的性能 。

什么?不同的索引,性能还不一样?

是的,这要从 change buffer 说起。

Change Buffer是什么

MySQL 在启动成功后,会向内存申请一块内存空间,这块内存空间称为 Buffer Pool 。

Buffer Pool 内维护了很多内容,比如 缓存页、各种链表、redo log buff、change buffer等等 。

回到正题, change buffer 是用来干嘛的?

当索引字段内容发生更新时( update、insert、delete ),要更新对应的 索引页 ,如果 索引页 在 Buffer Pool 里命中的话,就直接更新 缓存页 。

否则, InnoDB 会将这些更新操作缓存在 change buffer 中,这样就无需从硬盘读入 索引页 。

下次查询索引页时,会将索引页读入 Buffer Pool ,然后将 change buffer 中的操作应用到对应的缓存页,得到最新结果,这个过程称为 merge ,通过这种方式就能保证数据逻辑的正确性。

不难看出, change buffer 通过 减少硬盘随机IO读 与 提高内存利用率 ,让数据库的并发能力更强。

如果不了解 Buffer Pool、redo log、索引页 是什么,可以看看阿星之前写的几篇文章

看到这里小伙伴有疑问了, change buffer 在内存中,如果万一 MySql 实例挂了或宕机了,这次的更新操作不全丢了吗?

其实不用担心, InnoDB 对这块有相应的持久化方案,会有后台线程定期把 change buffer 持久化到硬盘的系统表空间( ibdata1 )。

并且每次 change buffer 记录的内容,会写入到 redo log buff 中,由后台线程定期将 redo log buff 持久化到硬盘的 redolog 日志。

最后 MySql 重启,可以通过 ibdata1 或 redolog 恢复 change buffer ,恢复的过程,分为下面几种情况

  1. change buffer
    ibdata
    ibdata
    
  2. change buffer
    redolog
    change buffer
    
    • change buffer
      redo log
      redo log
      commit
      binlog
      
    • change buffer
      redolog
      redolog
      commit
      binlog
      binlog
      redolog
      redolog
      change buffe
      
    • change buffer
      redolog
      redolog
      binlog
      redolog
      

如果不清楚 redolog 与 binlog 的可以看看下面这几篇文章

如何使用Change Buffer

看到这里,相信大家对 change buffer 有了基本的认识。

现在可以展开讲讲 change buffer 的使用限制。

是的,你没听错, change buffer 不能随随便便用。

一般我们可以把常用索引分类为下面几种

其中 聚簇索引 和 唯一索引 是无法使用 change buffer ,因为它们具备 唯一性 。

当更新 唯一索引 字段的内容时,需要把相应的索引页加载进 Buffer Pool ,验证唯一性约束,此时都已经读入到 Buffer Pool 了,那直接更新会更快,没必要使用 change buffer 。

也就是说,只有非唯一索引才能使用 change buffer

业务场景

那现在有一个问题,使用 change buffer 一定可以起到加速作用吗?

相信大家都清楚 merge 的时候是将 change buffer 记录的操作应用到索引页。

所以索引页 merge 之前, change buffer 记录的越多收益就越大。

因此对于写多读少的业务场景,索引页在写完以后马上被访问到的概率很小,此时 change buffer 的收益最高。

相反,读多写少的业务场景,更新完马上做查询,则会触发 change buff 立即 merge , 不但硬盘随机 IO次 没有减少,还增加 change buffer 的维护成本。

因此 change buff 适合写多读少的业务场景

选择索引

由于唯一索引用不上 change buffer 的优化机制,在业务可以接受的情况下,从性能角度出发建议考虑 非唯一索引

如果所有的更新后面,都马上伴随着对这个记录的查询,应该关闭 change buffer , innodb_change_buffering 设置为 none 表示关闭 change buffer 。

而在其他情况下 change buffer 都能提升更新性能。

我们可以通过 innodb_change_buffer_max_size 来动态设置 change buffer 占用的内存大小,假设参数设置为 50 的时候,表示 change buffer 的大小最多只能占用 buffer pool 的 50% 。

最后留个思考题,如果知道 redo log 一定清楚 WAL 机制, change buffer 与 WAL 分别提升性能的侧重点是什么?

MySQL的InnoDB的change buffer:在写密集型工作负载下的性能影响与参数调优 Change Buffer 是 InnoDB 存储引擎中一个重要的组成部分,它通过延迟对非唯一二级索引的写操作,减少随机 I/O,从而提高写性能。然而,Change Buffer 也存在一些缺点,例如增加读取延迟、占用内存空间等。因此,需要根据实际情况,合理配置 Change Buffer 的参数,并监控其使用情况,才能充分发挥其优势,避免其劣势。理解 Change Buffer 的工作原理和特性,并结合实际应用场景进行调优,是优化 MySQL 数据库性能的关键。 阅读详情

相关推荐

InnoDB之Change Buffer

可以简单理解为是针对MySQL中,使用非聚簇索引(二级索引)写操作的一个优化策略,它对DML(删、改)操作进行了优化。即:使用普通索引进行对数据表中数据进行update、delete操作时,MySQL会将需要操作的数据存放到Channge Buffer中。它属于InnoDB存储引擎,使用了InnoDB存储引擎才可以使用。

chengwe17的博客 513

阅读笔记 - MySQL Change Buffer

文章目录前言MySQL - Change Buffer什么是Change BufferChange Buffer原理为什么针对非唯一索引页Change Buffer好处适合使用场景相关参数参考文献 前言 仅为个人笔记,欢迎指正 MySQL - Change Buffer 什么是Change Buffer 在InnoDB中,当对应的数据不存在与Buffer Pool中时,为了避免大量的随机磁盘I/O可能带来的性能瓶颈,InnoDB 在Buffer Pool 中划分出一部分内存,称为Change Buffe

带着笑或是很沉默。 1059

MySQL的InnoDB的change buffer:在写密集型工作负载下的性能影响

它的作用是缓存对二级索引页的变更操作,特别是那些不在缓冲池中的索引页的变更。后续,当需要读取这个索引页,或者InnoDB在后台空闲时,会将Change Buffer中的变更合并到实际的索引页中,这个过程被称为Merge(合并)。Merge操作会将Change Buffer中的变更应用到磁盘上的索引页,使索引页的数据与实际数据保持一致。Merge操作是Change Buffer的核心部分,它负责将Change Buffer中的变更应用到磁盘上的索引页。好的,我们开始今天的讲座。

weixin_41455464的博客 482

MYSQL系列之 change buffer 和 redo log

读丁奇大佬课程笔记与思考 课程链接 WAL技术(Write-Ahead Logging) 先写日志,再写磁盘: 当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log(粉板)里面,并更新内存,这个时候更新就算完成了。同时,InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做。 刚刚update的语句还在缓存中未持久化磁盘,此时select是直接读取内存 redo log InnoDB的redo log固定大小,比如可配置一组

Kindle_code的专栏 3378

RI-CLPM vs CLPM:什么时候该用随机截距交叉滞后模型?

本文深入对比了交叉滞后模型(CLPM)与随机截距交叉滞后模型(RI-CLPM)的核心差异与应用场景。RI-CLPM通过分离个体间稳定特质与个体内动态波动,能更纯净地估计变量间的动态因果关系,避免CLPM可能存在的混淆。文章提供了清晰的模型选择决策框架,并辅以Mplus语法示例,帮助研究者根据变量特质稳定性与研究问题,正确选用模型以确保结论的严谨性。

weixin_29276847的博客 304

【密码专栏】超强进阶:PLONK VS Groth16(上)

前言 前文《天冷了,干了这碗“零知识证明”鸡汤》对「零知识证明学习」作了一个形象化的比喻:炖鸡汤。那么本系列的主要内容可以简单概括为《论高压锅炖鸡汤的一百种方法》之方法二。在学会了“清炖鸡汤”之后,不如来一口“阿胶鸡汤”补补脑细胞吧! 正如鸡汤不同风味之间各具千秋,不同的zk-SNARK方案也各有所长。zk-SNARK方案可以被分为【通用】与【非通用】zk-SNARK,PLONK与Groth16分别是其中的典型代表。通过本系列,我们将对PLONK算法内容作简要介绍,并指出PLONK和Groth16算法思路上

Hyperchain的博客 1805

浅谈mysql日志:binlog和redolog,加更change buffer

1、redo log2、binlog3、redolog和binlog区别 1、redo log 又叫重做日志,是innodb存储引擎层的日志,属于物理日志。采用循环写入方法,用来记录修改之后的值,不管事务是否提交,都会把事务操作的变化记录下来。如果每次更新都需要一次次写入磁盘成本很高,所以采用先写日志再写磁盘。 日志大小是固定的,采用循环写入的方法。 2、binlog 又叫归档日志,是mysql server层的日志,属于逻辑日志。是以二进制形式进行记录,采用追加写入的方法,用来记录表字段修改数据更新等一.

weixin_44204235的博客 874

Windows Server 2012评估版过期自动关机问题:两种高效解决方案详解

本文针对Windows Server 2012评估版过期导致的自动关机问题,提供了两种高效解决方案。一是通过slmgr.vbs命令重置授权,临时延长评估期;二是使用DISM工具将评估版转换为正式版,一劳永逸。文章详细解析了两种方法的操作步骤、注意事项及适用场景,帮助用户快速恢复服务器稳定运行。

pytorchlight8的博客 1195

Mysql InnoDB三大特性-- change buffer

Mysql InnoDB三大特性--change buffer 转载于:https://www.cnblogs.com/xibuhaohao/p/10724231.html

weixin_34088598的博客 235

KEIL MDK实战:如何用fromelf工具解析STM32的ELF文件结构(附完整命令行)

本文详细介绍了如何使用KEIL MDK中的fromelf工具解析STM32的ELF文件结构,包括内存段分析、符号表追踪和反汇编关键函数等实战技巧。通过完整的命令行示例,帮助嵌入式开发者优化内存占用、排查运行时问题,并提升STM32项目的开发效率。

weixin_42631411的博客 187

【Java基础知识 1】Java入门级概述

优快云最强Java专栏,包含全部Java基础知识点、Java8新特性、Java集合、Java多线程、Java代码实例,理论结合实战,实现Java的轻松学习。

学Java,找哪吒 16万+

mysql的change buffer

change buffer 的作用 当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InooDB 会将这些更新操作缓存在 change buffer 中,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行 change buffer 中与这个页有关的操作。通过这种方式就能保证这个数据逻辑的正确性。 需要说明的是,虽然名字叫作 change buffer,实际上它是可以持久化的数据。也就

qq_33300570的博客 2917

Altium Designer系列: 软件系统参数配置保存

【Altium Designer实践】 软件系统参数配置保存 作者 CodeAllen ,转载请注明出处 目录设置中文菜单高亮模式设置文件关联pcb设置布线设置保存配置文件(复用) 设置中文菜单 DXP->Preferences 高亮模式设置 文件关联 pcb设置 布线设置 保存配置文件(复用) ......

CodeAllen嵌入式 2018

InnoDB原理篇:Change Buffer是如何提升索引性能的

前言 相信很多小伙伴设计索引时,考虑更多的是索引是否能覆盖大部分的业务场景,却忽略了索引的性能。 什么?不同的索引,性能还不一样? 是的,这要从change buffer说起。 Change Buffer是什么 MySQL在启动成功后,会向内存申请一块内存空间,这块内存空间称为Buffer Pool。 Buffer Pool内维护了很多内容,比如缓存页、各种链表、redo log buff、change buffer等等。 回到正题,change buffer是用来干嘛的? 当索引字

xiaolegeaizy的博客 457

《SOC架构-ARM架构-文档导读》-目录

小白请看“Armv8/Armv9架构从入门到精通”专栏。以翻译为主的,深度深度深度深度/深入深入深入 学习ARM架构的文章。

baron-周贺贺-代码改变世界ctw 2085

Flow Matching03-01:微分方程【微分方程(描述变化规律的方程):包含未知函数和它的导数的方程】【公式解(精确)、数值解(逼近)】

好的,我将从数学角度详细解释Flow Matching,从高中生能理解的基础知识开始,逐步深入到高级概念。

u013250861的博客 219

一文搞懂 MySQL InnoDB架构 Buffer Pool、Change Buffer、自适应哈希索引、Log Buffer

从 Redis 的第一人称视角出发,拟人故事化方式和诙谐幽默的言语与各路“神仙”对话,配合 158 张图,由浅入深循序渐进的讲解 Redis 的数据结构实现原理、开发技巧、运维技术和高阶使用,让人轻松愉快地学习。在磁盘上,Change Buffer 属于系统表空间的一部分,当数据库服务器关闭时,索引变更将在此处缓冲存储。当其他操作将受影响的页读入 Buffer Pool 时,随后将缓存的更改合并,避免了从磁盘读取二级索引页至 Buffer Pool 所需的大量随机访问 I/O。"运维总监瘫坐在监控屏前!

码哥字节 1239

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

写缓冲(change buffer),这次彻底懂了!!!

上篇《缓冲池(buffer pool),彻底懂了!》介绍了InnoDB缓冲池的工作原理。简单回顾一下:(1)MySQL数据存储包含内存与磁盘两个部分;(2)内存缓冲池(...

shenjian58的博客 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Change Buffer:提升InnoDB性能的关键技术

摘要:Change Buffer是一种特殊的数据结构,用于缓存二级索引页的更改操作,当这些页不在缓冲池中时。本文将介绍Change Buffer的工作原理、优势和配置,并提供了监控Change Buffer的方法。Change Buffer是InnoDB存储引擎中的一个重要特性,它通过缓存二级索引页的更改操作,避免了从磁盘读取这些页所需的随机访问IO。当执行INSERT、UPDATE或DELET...

小技术君 734

Mysql - 普通索引与唯一索引之间性能差别change buffer

开始之前先做一个总结和对一个误区进行说明(我误解了好久)...... 总结:普通索引(或没有二级索引)、唯一索引当执行查询操作时,性能本身没有差距;执行写(insert、update、delete)操作时,如果数据页在内存中性能差距也可以忽略;如果数据页不在内存中,那么非唯一索引可以只在change buffer中做修改,而唯一索引一定要从磁盘中获取数据页加载到内存中,判断唯一操作。即只有写操作并且数据页不在Buffer Pool中时,非唯一索引可以利用change buffer将随机访问磁盘操作...

it_lihongmin的博客 2149

深入理解MySQL Change Buffer:原理、配置与实践

在MySQL数据库性能优化中,磁盘I/O瓶颈往往是制约查询与更新效率的关键因素。尤其是当业务存在大量辅助索引(非唯一索引)的修改操作(如insert、update、delete)时,若每次修改都需要从磁盘读取对应的数据页到Buffer Pool,会产生大量随机I/O,严重影响性能。而MySQL的Change Buffer(更改缓冲区)正是为解决这一问题而生的重要优化机制。本文将从原理、核心问题、配置方法到状态监控,全面解析Change Buffer的技术细节与实践方案。

专注Java和MySQL领域知识分享 1500

InnoDB的change buffer

什么是change buffer? 当MySQL要更新一个数据页的时候,如果这个数据页正好在内存中,就直接更新,而如果这个数据页不在内存中的话,在不影响数据一致性的前提下,InnoDB会将这些更新缓存到change buffer中,这样就能减少对磁盘的访问。当下次访问这个数据页的时候,将这个数据页加载到内存,然后执行change buffer中的操作。通过这个流程保证逻辑上的正确性。显然将更新操作缓存到change buffer可以减少磁盘IO,由于是缓存执行速度也有极大提升,而且是读入内存是要占用b..

轩1024的博客 380

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

Change Buffer 是 MySQL InnoDB 存储引擎中的一个机制, 用于。而不立即执行这些操作,随后,当 InnoDB 进行合适条件的时候(如页被读取或Flush操作), 会将这些变更写入到二级缓存中。:通过二级索引的变更暂存,可以减少对磁盘的频繁写入,提升插入更新操作的性能。:Change Buffer 可以再后续的操作中批量处理这些变更,减少了随机写入的开销从图中我们可以知道 Buffer Pool 里面有一块内存是留给 change buffer 的。

qq_74916326的博客 1169

InnoDB的三大特性 change buffer

1 什么是change buffer 从图中可以看到 buffer pool中有insert buffer page 当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InnoDB 会将这些更新操作缓存在 change buffer 中,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行 change buffer 中与这个页有关的操作。通过这种方式就能保证这个数据逻辑的...

DBA之路的博客 404
上一篇: 高并发下如何保证接口的幂等性?
下一篇: RocketMQ 消息积压了,增加消费者有用吗?
JavaMonsterr
博客等级 码龄4年 211粉丝 481原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值