您现在的位置是:首页 > 正文

【Mysql】 InnoDB引擎深入- 内存结构之ChangeBuffer | Log Buffer

2024-04-01 01:56:29阅读 9

ChangeBuffer

ChangeBuffer是InsertBuffer 的升级版本,InsertBuffer主要是针对insert 操作进行缓存,而ChangeBuffer是针对 insert、update、delete 操作都进行缓存。

ChangeBuffer是InnoDB引擎中比较关键的特性功能。它是一种特数据的数据结构。

​ 官方描述:更改缓冲区是一种特殊的数据结构,当这些页面不在 缓冲池中时 ,它会缓存对 二级索引页面的更改。可能由 、 或 操作 (DML) 导致的缓冲更改 稍后 在 页面通过其他读取操作加载到缓冲池中时被合并。

通过之前的学习,我们知道,当DML数据时,并不是直接去写入磁盘,而是先判断再缓冲池中判断是否有该页,如果有则直接修改(后续通过checkpoint刷新到磁盘中)。如果缓冲池中不存在该页,则先读取到缓冲池,然后进行修改(从磁盘离散型读取页到内存会导致性能地下)。

​ 但是我们要知道通常来说应用程序中行记录的插入顺序时按照主键递增的顺序进行插入的,所以不需要随机磁盘读取页到内存然后插入,这时效率其实时挺快的。但是,不可能一张表上只会有一个聚集索引,更多的情况下,一张表上还会存在多个非聚集索引,它是非聚集索引顺序排序的。所以插入数据不仅会对聚集索引进行维护,仍需要对非聚集索引进行维护。

​ 在这样的情况下进行插入数据操作时,它依旧是按照主键顺序进行顺序存放的,但是对于非聚集索引它就是不是顺序的了(某些情况下,也可能是循序的,比如非聚集索引是递增的时间之类的),此时就需要离散性地去访问磁盘中非聚集索引页,读取到内存中进行插入操作,像这种随机读取的操作就导致了性能的下降。

写入数据时,大致过程如下:

  1. 先判断缓冲池中是否存在该数据页 和 涉及到的非聚集索引页,如果存在直接插入。

  2. 如果不存在,则去磁盘读取数据页(因为插入时按照主键顺序插入的,可以很快的找到索引页,索引对于聚集索引页的维护效率很快),同时从磁盘离散性的读取非聚集索引页(因为此时对于非聚集索来说,插入并不是按照非聚集索引顺序来的,需要随机读取到索引页),所以为了优化这种情况下性能问题,使用了changebuffer。

ChangeBuffer的目的就是当对于非聚集索引的DML操作,不是每一次直接插入到索引页中,而是当缓冲池中不存在索引页时,则先放入changebuffer的数据结构中。稍后 在 页面通过其他读取操作加载到缓冲池中时被合并。 通常能将多个插入合并到一个操作中,同时也避免了频繁的IO操作,提高了性能。

InnoDB引擎会使用ChangeBuffer的条件:

  • 索引是辅助索引:这个不需要再解释了....

  • 索引不是唯一的:因为如果索引是唯一的,那么再插入时必然少不了唯一性的校验的操作,即少不了离散型访问索引页的操作,这样ChangeBuffer 就失去了意义,因为它本身就是为了避免离散读取操作。

                         

 

Log Buffer

重做日志(redo Log):重做日志是一种基于磁盘的数据结构,用于在崩溃恢复期间纠正由不完整事务写入的数据。

Log Buffer是保存要写入磁盘日志文件的数据的内存区域。也就是说,当发生DML操作时,会先写入Log Buffer中,其内容会定期的刷新到磁盘日志文件。

网站文章

  • [unity3d]unity聊天功能

    [unity3d]unity聊天功能

    感觉之前的聊天功能可能有一些缺陷,今天收到书华兄的启发,发表一些感慨,C# .net高手跟新手的区别就是,新手仅仅满足功能上的实现,而很少去考虑性能上的问题,比如高并发怎么处理,打个比方,新手做完聊天功能之后,会沾沾自喜,而不考虑最大客户连接有多少,做个实验,如果连续有四个左右的客户端同时连接到服务器端,服务器就要消耗将近200M的内存,这时机器可怕的事情,如果不做处理的话,...

    2024-04-01 01:56:21
  • idea运行报Command line is too long. Shorten command line for JeecgSystemCloudApplication

    idea运行报Command line is too long. Shorten command line for JeecgSystemCloudApplication

    报错信息 : Command line is too long. Shorten command line for JeecgSystemCloudApplication or also for Sp...

    2024-04-01 01:56:14
  • Spring Boot整合Aop实现日志记录

    Spring Boot整合Aop实现日志记录

    Spring Boot整合Aop实现日志记录

    2024-04-01 01:55:50
  • 关于图像融合

    关于图像融合

    一、概述 图像融合的目的是融合多个原图像中的冗余信息和互补信息,强化图像中的信息,以利于对图像的进一步分析。图像融合的出来可以在三个层次上来进行:像素及融合、特征及融合和决策级融合。 1、像素及融合 这是三个层次中最基本的融合,得到的结果具有更好地细节信息,如边缘、纹理的提取。这种方法尽可能多的保存原图像中的信息,使得融合后的图片不论是内容还是细节都有所增加,这个优点是独一无二的,唯一的缺陷...

    2024-04-01 01:55:44
  • 实用:在WIN的CMD上显示链接过的WIFI密码

    实用:在WIN的CMD上显示链接过的WIFI密码

    用的时候,将"WiFi名称"替换为你要查看密码的Wi-Fi网络的名称。执行该命令后,你将在输出结果中找到"关键内容"字段,其对应的值就是Wi-Fi密码。如果你要查看以前连接过的Wi-Fi密码,可以使用...

    2024-04-01 01:55:37
  • 代码随想录算法训练营第43天 || 1049. 最后一块石头的重量 II || 494. 目标和 || 474.一和零

    代码随想录算法训练营第43天 || 1049. 最后一块石头的重量 II || 494. 目标和 || 474.一和零

    2024-04-01 01:55:12
  • python中Iterable类型调用时包导入时from collections import Iterable执行报错问题解惑

    python中Iterable类型调用时包导入时from collections import Iterable执行报错问题解惑

    最近刚刚接触python,找了一些资料,在慢慢学基础,今天遇到一个问题,其实是介绍关于用 Iterable中isinstance方法判断一个对象是否可以迭代时,要先导入包,好多资料介绍的都是from ...

    2024-04-01 01:55:03
  • Gradle中的buildScript代码块

    buildscript代码块中的repositories和dependencies的使用方式与直接在build.gradle文件中的使用方 式几乎完全一样。gradle是由groovy语言编写的,支持...

    2024-04-01 01:54:56
  • [Nginx入门] --mac 下安装nginx

    背景:操作手册参考:How to Install NGINX on Mac | Installing NGINX on Mac - Javatpoint步骤如下:Step 1: 下载 安装 Homeb...

    2024-04-01 01:54:50
  • 支付宝、微信扫一扫

    function sys(){ // alert('扫一扫') //判断浏览器环境 var userAgent = navigator.userAgent; if (userAgent.indexOf("MicroMessenger") > -1){ // 获取配置信息 // ...

    2024-04-01 01:54:25