Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一些补充的知识点-写缓冲Change Buffer

一些补充的知识点-写缓冲Change Buffer

作者头像
用户4283147
发布于 2023-12-28 08:57:32
发布于 2023-12-28 08:57:32
2330
举报
文章被收录于专栏:对线JAVA面试对线JAVA面试
什么是Change Buffer

MySQL在查询的时候有一种预读机制, 为了提高同样数据的查询效率,会将磁盘中的数据加载到内存中,Buffer Pool(缓冲池)就承担了这么一个角色。

如果每次写操作,数据库都直接更新磁盘中的数据,会很占磁盘IO,那么MySQL是怎么优化的呢?

当用户执行SQL对非唯一索引进行更改时,如果索引对应的数据页不在缓存中时,InnoDB不会直接加载磁盘数据到缓存数据页中,而是缓存对这些更改操作(buffer changes)。

缓存区的更改操作会在磁盘数据被其它读操作加载到缓存中时合并(Merge)到对应的缓存数据页中。

InnoDB在Buffer Pool中开辟了一块内存,用来存储变更记录,用来缓存写操作到内存,就是Change Buffer。MySQL使用它的目的是降低写操作的磁盘IO,提升数据库性能。

Change Buffer结构

从图中右侧信息可以做一些小总结:

  1. ChangeBuffer用于存储SQL变更操作;
  2. ChangeBuffer中的每个变更操作都有其对应的数据页,并且该数据页未加载到缓存中;
  3. 当ChangeBuffer中变更操作对应的数据页加载到缓存中后,InnoDB会把变更操作Merge到数据页上;
  4. InnoDB会定期加载Change Buffer中操作对应的数据页到缓存中,并Merge变更操作
写入流程

执行两条Insert语句,其中左侧的要更新的数据页 Page1 不在Buffer Pool,而右侧需要更新的数据页Page2在Buffer Pool缓存中。

  1. 数据页Page1不在Buffer Pool中的话将写入Change Buffer,缓存下对Page1的修改
  2. 数据页Page2在缓存中,直接更新(最终写入磁盘)

这里会写两次内存:一次是修改Buffer Pool的数据页、另一次是Change buffer中记录这个写入操作

但是会写一次磁盘:一次Redo Log,因为两次操作合在一起写了一次磁盘,还是顺序写

注意:默认下ibdata存放InnoDB表(InnoDB数据字典)元数据、undo logs、change buffer, doublewrite buffer

写入后再读

读Page2的时候很好理解,直接从Buffer Pool 中返回,但是读Page1时,需把Page1从磁盘读入内存,然后将Change Buffer里面的操作日志,Merge生成一个正确版本并返回结果。

总结
SQL的变更操作什么时候被放在Change Buffer?

从文章开始我们就知道并不是所有的MySQL操作都会进入Change Buffer ,其实只有符合以下几个条件的,才会在执行阶段不直接修改数据页,而是放入Change Buffer。

  1. SQL是对非唯一键数据的修改(二级索引)
  2. 修改的数据页不在 Buffer Pool缓冲中
  3. 修改后不需要立即返回变更后的数据
  4. 该SQL是DML、不是DDL (也就是修改类型是对数据的修改)

为什么Change Buffer只能是缓存非唯一索引?

Change Buffer只适用于非唯一索引数据的变更修改情况,而不能为唯一索引或者主键数据的原因在于【唯一索引需要做唯一性校验】

那么是怎么做唯一性校验的呢?对唯一索引进行更新时必须将对应的数据页加载到Buffer Pool缓存中进行校验,自然就不会用到Change Buffer

什么时候会把Change Buffer 数据持久化(merge)到磁盘?

Change Buffer只是缓存了数据的变更操作,但是没有实际落盘持久化,以下情况会触发Merge落盘。

  1. 访问变更操作对应的数据页
  2. InnoDB后台线程定期Merge
  3. Buffer Pool缓冲空间不足
  4. 数据库正常关闭时
  5. Redo Log 写满时

但是基本不会出现Redo Log写满的情况,这个种情况出现的话,数据库都不可用了

Change Buffer适合什么样的业务场景呢?

主要适合这两种情景:数据大部分是非唯一索引写多读少,并且修改后不需要立即返回修改值

相反在这两种场景反而不适合,Change Buffer 反而会成了负担,增加了复杂度。就是上面合适场景的反向, 数据库是唯一索引,修改后需要立即读取修改值。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-12-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 对线JAVA面试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL写缓冲(change buffer),终于懂了!!!(收藏)
上篇《MySQL缓冲池(buffer pool),终于懂了》,介绍了InnoDB缓冲池的工作原理。 简单回顾一下: (1)MySQL数据存储包含内存与磁盘两个部分; (2)内存缓冲池(buffer pool)以页为单位,缓存最热的数据页(data page)与索引页(index page); (3)InnoDB以变种LRU算法管理缓冲池,并能够解决“预读失效”与“缓冲池污染”的问题; 画外音:细节详见《MySQL缓冲池(buffer pool),终于懂了》。 毫无疑问,对于读请求,缓冲池能够减少磁盘IO,
架构师之路
2022/03/30
1.7K0
MySQL的普通索引和唯一索引到底什么区别?
普通索引可重复,唯一索引和主键一样不能重复。 唯一索引可作为数据的一个合法验证手段,例如学生表的身份证号码字段,人为规定该字段不得重复,那么就使用唯一索引。(一般设置学号字段为主键)
JavaEdge
2022/03/02
3.6K0
MySQL的普通索引和唯一索引到底什么区别?
MySQL实战之普通索引和唯一索引,应该怎么选择?
在之前的文章中,我们讲解了索引的基本概念,相信你已经了解了唯一索引和普通索引的区别。今天我们就来讨论一下,在不同的业务场景下,应该选择普通索引,还是唯一索引?
特特
2023/03/09
1.8K1
从Mysql架构看一条更新sql的执行过程
上一篇文章我们讲了一条查询sql时如何执行的. 今天我们继续来看下一条更新sql的执行流程.
架构狂人
2023/10/28
3730
从Mysql架构看一条更新sql的执行过程
change buffer,你了解么?
最近在极客时间看丁奇大佬的《MySQL45讲》,真心觉得讲的不错,把其中获得的一些MySQL方向的经验整理整理分享给大家,有兴趣同学可以购买相关课程进行学习。
AsiaYe
2020/05/06
2.1K0
6 mysql底层解析——缓存,Innodb_buffer_pool,包括连接、解析、缓存、引擎、存储等
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
天涯泪小武
2019/09/18
1.5K0
6 mysql底层解析——缓存,Innodb_buffer_pool,包括连接、解析、缓存、引擎、存储等
【MySQL 系列】MySQL 架构篇
Server 层:负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现,主要包括连接池,执行器、优化器、解析器、预处理器、查询缓存等。另外,所有的内置函数(如日期、时间、数学和加密函数等)和所有跨存储引擎的功能(如存储过程、触发器、视图等)都在 Server 层实现;
栗筝i
2024/03/19
2.4K0
【MySQL 系列】MySQL 架构篇
一文搞懂 MySQL InnoDB架构 Buffer Pool、Change Buffer、自适应哈希索引、Log Buffer
书接上回,林渊重生使得 MySQL B+Tree 提前问世二十年,这次亲自操刀 InnoDB 架构引擎的设计,一个支持高并发读写、支持事务行级锁的划时代架构诞生...
码哥字节
2025/04/09
7.1K0
一文搞懂 MySQL InnoDB架构 Buffer Pool、Change Buffer、自适应哈希索引、Log Buffer
MySQL十七:Change Buffer
在之前的文章《InnoDB的存储结构》介绍的InnoDB的存储结构的组成中,我们知道Change Buffer也是用InnoDB内存结构的组成部分。
云扬四海
2022/09/26
9100
2023-2024年java八股文面试之一:数据库
是MYSQL数据库中的一个重要的内存组件,介于外部系统和存储引擎之间的一个缓存区,针数据库的增删改查这些操作都是针对这个内存数据结构中的缓存数据执行的,在操作数据之前,都会将数据从磁盘加载到中,操作完成之后异步刷盘、写undo log、binlog、redolog等一些列操作,避免每次访问都进行磁盘IO影响性能。
用户5737562
2023/09/05
3450
2023-2024年java八股文面试之一:数据库
MySQL核心知识学习之路(5)
作为一个后端工程师,想必没有人没用过数据库,跟我一起复习一下MySQL吧,本文是我学习《MySQL实战45讲》的总结笔记的第五篇,总结了MySQL索引相关的实践使用问题。
Edison Zhou
2021/03/04
5690
MySQL核心知识学习之路(5)
面试官的灵魂一击:你懂 MySQL 事务日志吗?
大家都清楚,日志是 MySQL 数据库的重要组成部分,记录着数据库运行期间各种状态信息。MySQL 日志主要包括「错误日志」、「查询日志」、「慢查询日志」、「二进制日志(binlog)」 和 事务日志(redo log、undo log)几大类。
用户6543014
2020/12/08
4800
面试官的灵魂一击:你懂 MySQL 事务日志吗?
你分得清MySQL普通索引和唯一索引了吗?
一个市民系统,每个人都有个唯一身份证号; 业务代码已保证不会写入两个重复的身份证号; 如果市民系统需要按照身份证号查姓名,就会执行类似SQL:
JavaEdge
2020/07/25
2.2K1
MySQL底层概述—1.InnoDB内存结构
Buffer Pool是缓冲池的意思。Buffer Pool的作用是缓存表数据与索引数据,减少磁盘IO,提升效率。
东阳马生架构
2025/02/10
2190
MySQL普通索引和唯一索引到底什么区别?
普通索引可重复,唯一索引和主键一样不能重复。 唯一索引可作为数据的一个合法验证手段,例如学生表的身份证号码字段,我们人为规定该字段不得重复,那么就使用唯一索引。(一般设置学号字段为主键)
JavaEdge
2022/11/30
6230
MySQL普通索引和唯一索引到底什么区别?
写缓冲 change buffer
(1)MySQL数据存储包含内存与磁盘两个部分; (2)内存缓冲池(buffer pool)以页为单位,缓存最热的数据页(data page)与索引页(index page); (3)InnoDB以变种LRU算法管理缓冲池,并能够解决“预读失效”与“缓冲池污染”的问题;
名字是乱打的
2022/03/04
5410
写缓冲 change buffer
MySQL 数据库的提速器-写缓存(Change Buffer)
将数据页从磁盘读入内存中涉及随机 IO 访问,这也是数据库里面成本最高的操作之一,而利用写缓存(Change Buffer)可以减少 IO 操作,从而提升数据库性能。
田维常
2020/03/11
3.5K0
MySQL的InnoDB存储引擎内存结构
InnoDB内存结构分为三部分,分别是BufferPool缓冲池,ChangeBuffer写缓冲区,LogBuffer日志缓冲区。
Ryan_小鱼
2025/03/31
1560
MySQL的InnoDB存储引擎内存结构
你确定分得清MySQL普通索引和唯一索引?
某居民系统,每人有唯一身份证号。如果系统需要按身份证号查姓名,就会执行类似如下SQL:
JavaEdge
2021/02/22
3.3K0
你确定分得清MySQL普通索引和唯一索引?
技术分享 | Update更新慢、死锁等问题的排查思路分享
在开始排错之前我们需要知道 Update 在 MySQL 中的生命周期是什么,MySQL 如何执行一个事务的。
老叶茶馆
2021/10/12
2.8K0
推荐阅读
相关推荐
MySQL写缓冲(change buffer),终于懂了!!!(收藏)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档