数据库-sql执行深度剖析以及redo log和undo log(下)(二)

news2024/11/28 22:48:03

目录

buffer pool

change Buffer

Log Buffer

redo log

随机IO/顺序IO

redo log刷盘时机

redo logt特点

redo log结构

Adaptive Hash Index

磁盘区域

undo log

总结更新流程

BInlog


基于上一章sql执行原理基础上,我们来深入探讨sql更新的整个原理。

buffer pool

那么buffer pool他又可以分为几块。

让我们看到他除了有一个buffer pool 之外,他还有一个Change Buffer 和侧边的自适应的hash index(hash索引):就是意味着他把一部分的索引也放到了内存里面来了。

然后,我们还可以看到,内存里面,还有一个Log buffer。

那么我么来看看,他们到底是干什么的呢?

Buffer Pool:他缓存的是数据信息。包括我们的数据本身和索引,因为索引本身也是一种数据,所以我们说磁盘跟内存交互的最小的单位叫做页。所以它里面存的就是数据页,data page和索引页 index page。

那么我们怎么知道buffer pool他是怎样的一个存在的状态呢?

我们可以通过show status 查看服务器状态的命令。

Buffer pool他默认的大小是128兆。也就意味找他占用128兆的内存。当然这个值是可以调整的。

如果说,我们把我们要用的或者要写的数据放到内存里面的话,又会存在一个问题,这个内存他写满了怎么办呢?

他采用看和redis同样的算法LRU算法。就是他把最近没有使用的数据从内从剔除,最终留下来的都是热点数据。

我们的bufferpool 对我们提升读写性能是非常有帮助的。

所以我们要去思考一个问题:

如果我们要去更新一个数据页的时候,而我们的数据页他也加载到我们的缓冲池里面的话,那我们是不是直接更新就好了呢。

但是如果我们更新的数据正好不在buffer pool里面,怎么办呢?

那我们是不是只能从磁盘里面去读取到内存里面,然后再到内存里面去对他进行修改。

那么这种更新数据的方式有没有优化的方案呢?

因为他不在内存中,我们是不是至少要发生一次IO.

所以我们就要涉及到第二个区域:

change Buffer

如果我们要更新的数据他不是唯一索引;并且没有数据重复的情况;也就是说你不是唯一索引,我在修改数据的时候,我并不需要来跟我们磁盘里的数据去进行对比;来判断他的唯一性。如果不是唯一性的索引,我不需要去最终到磁盘去确认这个数据在我修改了之后,或者插入了之后,会不会重复。那么这种情况我们就可以直接把我们要修改的数据记录在change buffer里面。最终在把这个change buffer一次性的同步到我们的磁盘。通过这样的方式来一次性的来更新我们的语句。

在5.5版本下,change buffer 还叫做Insert buffer。现在已经改成change buffer了。因为以前只能缓冲这种插入的数据,就是如果你插入的数据不需要去判断他的唯一性的时候,就把他放在Insert buffer里面。他和chanage buffer是同一个概念。现在chanage buffer他也支持delete 和update操作。

最后我们会把change buffer会同步到我们的磁盘当中。而这个动作我们把他叫做marge.

那么什么时候会有这个marge的动作呢?

就是把我们这种不需要去检查唯一性的数据最终写入都我们磁盘里面

那么有多少的情况发生merge呢?:比如以下一些情况

  1. 访问数据页:我们要去访问数据页的时候,如果他要访问的数据还在change buffer里面,他会merge到我们的磁盘
  2. 后台线程: 刚刚说了,在我们的内存和磁盘之间有很多工作的后台线程,这些后台线程他其实会去定时的把我们内存中的数据同步到我们的磁盘。来减少我们内存和磁盘之间的数据的不一致性。
  3. 系统shut down:在我们系统值正常关机的时候,他会把我们的内存数据同步到磁盘里面去。
  4. redo log写满的时候

那么这些就是我们的change buffer.

如果说我们数据库里面的大部分索引,他们都是非唯一性的索引,不需要去检查他的唯一性,并且不是写多读少的业务场景 就可以用我们的change buffer。

那么ChangeBuffer 他也有一个参数来控制。

我们可以看到他默认占用buffer pool大小比例25%

如果是我们写多读少的情况,我么可以去调大我们的这个比例。

他是为了提高我们修改数据效率而设计的。

然后我么再来看

Log Buffer

那又是干什么的呢?

如果我们 buffer Pool里面的数据,也就是我们称之为脏页的数据,还没有写入磁盘。这个时候,我们数据库宕机了。或者说重启了

那么这个时候,我们的buffer Pool里面的内存数据是不是丢失了呢?

如果,我们往磁盘写数据,写到一半的时候,他会不会破坏我们的数据文件,最终会不会导致我们的数据库不可用呢?

所以为了避免这个问题,InnDB 里面针对于我们页面修改操作,把他们写入了一个日志文件,而且在我们数据库启动的时候,他会尝试从我们的日志文件中来进行恢复操作。这个也是Inndb的一个特性:崩溃恢复的能力

所以我们把他叫做 redo log.

redo log

他也是实现事务持久性的一个日志文件。

那么有了这个日志文件之后,我们是怎么去做的呢?

如图;

这个文件就是磁盘的 redo log(叫做重做日志),对应于/var/lib/mysql/目录下的 ib_logfile0 和 ib_logfile1,每个 48M。

所以这种先写日志在把内存的数据从同步到磁盘的操作,在mysql 他是叫做WAL(Write-Ahead Logging)的一个技术

但是到了这里我们又会有一个问题:

我们把数据写入到redo log时写入到磁盘,而写入到DB file也是写入到磁盘,那这么做有什么意义呢?这不是多此一举吗?

所以我们来了解一下:什么叫做随机IO以及顺序IO。

随机IO/顺序IO

首先看一张磁盘结构图:

磁盘的最小的单元组成是扇区(一个弧度),通常是512个字节

操作系统他跟内存去打交道,他们之间最小的单位是页

那么操作系统跟磁盘去打交道,他们之间读写磁盘最小的单位是块

如果我们的要去操作的数据他是随机分散在这个磁盘里面的不同的页的,不同的扇区里面的话,那么我们怎么取找到这个数据的呢?

他是等到磁壁的旋转,旋转到一个指定的页之后,等我们的盘片找到了这扇区,他才能去找到我们需要的数据。然后一直找,直到所有的数据都拿出来,我的操作才能完成。

而这个就叫做:随机的IO

所以我们可以看到他读取数据的速度是非常慢的,他要等到我们的磁壁一直旋转,直到找到所有的数据

如果说,我们读取的数据,已经找到了第一块数据,他所需要的数据都是相邻的,我们需要的数据都在我们找到的数据的后面,那么我不需要去重新的寻址了,我只需要依次的往下去访问,然后拿到我需要的所有数据,

那么这种情况:我们就叫做他是顺序IO

所以很明显,顺序IO的效率比我们随机IO的小路高很多。

所以答案就在这里。为什么我们还要把数据写入到redo log的日志文件,而不是直接把数据同步到我们的DB file里面。

就是因为,我们的内存到磁盘的操作,他是随机的IO,而我们记录日志呢,他是顺序的IO。

顺序的IO效率更高。

所以通过这个来提升我们系统的吞吐量。

当然,我们写入redo log的操作,也不是每一次都需要去操作磁盘,在我们的Buffer Pool里面他还有一块内存区域。是用来专门保存即将要写入日志文件里的数据

他就是我们log Buffer的这个东西

他其实就是我们redo Log在内存中的一个缓冲区域。

现在他又有了log buffer了。就是在我们写入redo log里面是先写入我们的log buffer里面的

我们的log buffer默认的大小是16兆

还有一点,我们需要注意,redo log他主要是用来做崩溃恢复的

所以我们磁盘内数据主要还是来自我们内存中来的,

这里我们又有疑问,

我们logbuffer 他又是什么时候,把数据写入到我们的redo log的磁盘文件里面的呢?

就是我们操作系统本身,他也是有缓存的,所以我们把他叫做:os cache 或者 OS buffer

在我们每一次内存数据写入磁盘文件的时候,必然也要经过我们操作系统的缓存,。所以我们来看看他是怎么写入redo log里面的呢?

redo log刷盘时机

首先,他是跟事务相关的,有一个参数来控制,这参数默认值是1

0(延迟写) log buffer 将每秒一次地写入 log file 中,并且 log file 的 flush 操作同时进行。 该模式下,在事务提交的时候,不会主动触发写入磁盘的操作

1(默认,实时 写,实时刷) 每次事务提交时 MySQL 都会把 log buffer 的数据写入 log file,并且刷到磁盘 中去。

2(实时写,延 迟刷) 每次事务提交时 MySQL 都会把 log buffer 的数据写入 log file。但是 flush操作并不会同时进行。该模式下,MySQL 会每秒执行一次 flush 操作。

这是我们内存区域里面第四块内容。

那么redo log他有一个什么样的特点呢?

redo logt特点

  1. 他是在InnDB层面去实现的,也就是说,其他存储引擎是没有办法去使用这个日志文件的。仅仅在我们的InnDB中去实现了。
  2. 它属于一种物理日志,为什么叫做物理日志呢?是因为他记录的不是我们数据更新之后页的状态,他是记录了这个page页做了什么样的改动。
  3. redo log大小是固定的,默认的都是48兆。也就是说,我们写入到后面的时候,他会把前面的数据进行覆盖,

redo log结构

check point:他是写入文件最起始的位置。是当前要覆盖的位置

write pos代表循环写入已经写到那个位置。

如果他们俩碰到一起了,就说明我们redo log写满了。

那么他就会触发沙盘的操作,并且前面的内容会被覆盖。

Adaptive Hash Index

下节深入研究

那么看到这里,我们来看看InnDB他的磁盘结构是什么样的。

磁盘区域

既然是磁盘文件,那么在我们的磁盘里面都是能找到的。

最主要的是他里面是各种各样的tablespace。不同的表空间。

在InnerDB里面表空间他分成的五大类。

一个是系统的表空间,一个是独占的表空间,通用的表空间,临时的表空间,undo表空间

具体看官网资料。

undo log和我们redo log是一起的,因为他们都是跟我们事务有关系的。他俩组成起来,就叫做我们innerDB的事务日志

我们已经知道redo log的作用:他是为了实现崩溃恢复,为了提升我们修改数据的性能。

undo log

那么undo log是干嘛用的呢?

他叫做撤销或者回滚的日志。他记录的是事务发生之前的状态。如果我们在修改数据的时候,修改到一半,出现了异常,那么我们就可以用undo log 来实现一个回滚的操作,他是用来保证我们事务的原子性的。

那么我们执行一个undo,执行一个回滚的操作之后, 他是把我们的事务从逻辑上,恢复到事务之前的一个状态。

他跟redo log是不一样的。

redo log他是一个物理的日志

undo log他是一个逻辑的日志

这两个加起来,就叫做事务日志

undo log他默认在系统的表空间,当然我们也可以给他去创建一个表空间。

那么我们知道几个日志文件,

那么我们来简单总结一下更新的流程。

总结更新流程

那么我们修改语句他做了什么事情呢?

  1. 从内存或磁盘读取数据:那么我们事务开启的时候,他是不是先要从磁盘去加载数据,然后加载到内存,返回给我们server端的执行器。
  2. 然后我们的执行器,他会把我们这行值的数据改成我们更新的值。
  3. 然后我们要去记录两个日志文件,一个是undo log 是他用来执行我们事务的回滚,撤销操作的。还要记录我们的redo log,他是用来崩溃恢复用的
  4. 然后我们内存修改了,然后日志也记录了;之后呢 他会在我们buffer pool里面把修改的值进行修改。
  5. 最后我们事务提交,我们事务提交之后,我们后台有一部分线程,把我们的buffer pool里面的数据同步写入到,我们的磁盘里面

我们要知道一个概念,在内存和磁盘之间它是由很多的后台工作线程的。

那么在我们的mysql架构中三个层里面:

首先存储引擎层,他有两个事务日志:一个是undo 一个redo。

在我们的服务层呢,他也有一个日志文件,binlog,他是在我们的服务层去实现的。他是可以被所有的存储引擎共用的。

而我们的redo log 和undo log 他们都是在存储引擎层去实现的。

BInlog

那么binlog 他又是干嘛用的呢?

他实际是以事件的机制去记录了我们所有的DDL ,DML这些语句。也是一个逻辑的日志

他的作用:

  1. 一个是用来做主从,为什么可以做主从?我们从服务器会去请求拿到主服务器上的执行日志,然后Binlog去解析出来在从服务器去执行一遍。这个才是mysql主从的一个原理。他是通过binlog实现的。
  2. 数据的恢复:因为他里面记录之前的所有SQL语句,然后我么可以拿出来直接执行,进行恢复

那么在加上了binlog之后,我们一条sql他到底是怎样的更新的呢?

有了我们innDb层redo log和undo log以及加上我们的server 层上的bin log那么他的执行语句到底是什么样呢?

如图:

那么我们来总结下,这张图的重点:

  1. 我们更新的语句他是,先记录到内存,然后再写日志文件的,
  2. 然后记录redo log他有分成了两个阶段,第一个是 prepare阶段,第二个是commit阶段,因为他要等待先要写入bin log之后,才能进行commit.
  3. 在我们的存储引擎层和server层,他们是基于记录不同的日志的。在存储引擎层,他会去记录redolog和undo log。在我们的server 层,他会记binlog 而且这两个他们的先后顺序,是先记录redo log在记录bin log

数据库-mysql架构与sql执行原理(上)(一)_平凡之路无尽路的博客-CSDN博客

数据库-深度剖析mysql索引原理(上)(三)_平凡之路无尽路的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/26669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣(LeetCode)33. 搜索旋转排序数组(C++)

二分查找 二分的本质,是对某种性质的划分,一半满足,另一半不满足,即可划分。 比较 nums[mid]nums[mid]nums[mid] 和 nums[0]nums[0]nums[0] ,可以知道 midmidmid 左右哪一端有序。 如果左端有序,我们找往…

66.基于Django学习会话技术

1. 背景介绍 ​ HTTP协议有一个特性就是无状态的,是指协议对于交互性场景没有记忆能力。 ​ 随着动态交互的web应用的出现,HTTP的无状态特性严重阻碍了动态交互应用程序的发展,例如一些购物网站在进行购物时候都会进行了页面跳转/刷新&…

西门子 S7-1200 与 BL200PN 通信示例

准备 IO 模块:耦合器 BL200PN、数字量输出模块 M2082、数字量输入 M1081、 模拟量输入模块 M3401、模拟量输出 M4043。 2、BL200PN、S7-1200、PC 要同一局域网。将 BL200PN 和 S7-1200 上电,打开西 门子 TIA V13 软件,新建项目“BL200PN”…

SpringBoot开发的实用小工具集,YYDS

真正的大师,永远都怀着一颗学徒的心! 一、项目简介 springboot开发的实用小工具集 环境搭建说明 开发环境为jdk1.8,基于maven构建; 使用Idea或者eclipase开发; 基于SpringBoot搭建,大大简化了配置操作;…

DBCO-mPEG2000,二苯并环辛炔-mPEG MW 2000具有亲和力和稳定性

DBCO-mPEG2000白色固体, DBCO试剂在水性缓冲液中具有快速的亲和力和稳定性,可用于以高特异性和反应性标记叠氮化物修饰的生物分子。带有 PEG 臂的试剂会增加化合物的亲水性。西安凯新生物科技有限公司​DBCO 试剂已广泛应用于生物偶联、标记和化学生物学…

你需要知道的前端知识点,V8引擎是什么?采用哪些GC算法?

一、简单介绍V8引擎 V8引擎是一款主流的JavaScript执行引擎;V8执行引擎采用及时编译(执行速度提升);V8引擎中内存设置有上限(下方进行详解); 二、V8回收策略 采用分代回收思想;内存分为新生代对象存储与老生代对象存储;针对不同…

Colmap 实用教程 —— Command-line Interface

https://colmap.github.io/index.html Windows 通过 COLMAP.bat,Linux 通过 colmap 使用命令行调用 Colmap 工具。 Structure-from-Motion 简要介绍 从大范围来看的话,整个流程可以分成以下三个阶段: Feature detection and extractionFe…

MQ通道常用知识列举(一)

MQ的几个基本组件: 1. 什么是通道 通道是分布式队列管理器在IBM MQ MQI 客户端和IBM MQ服务器之间或两个IBM MQ服务器之间使用的逻辑通信链路。通道用于将消息从一个队列管理器移动到另一个队列管理器。 2, 启动通道 对发送方、服务器和请求方通道使用 MQSC 命令…

CentOS 7.6安装JDK8过程(通过官网下载压缩包方式)

Oracle官网JDK下载地址 JDK8下载地址 选择tar.gz压缩包进行下载 复制下载链接,登录服务器,执行wget xxxxx(刚刚复制的下载地址) 下载完毕后,执行解压命令tar -zxvf xxxxx.tar.gz 配置/etc/profile 执行命令vim /etc…

把Mybatis Generator生成的代码加上想要的注释

作者:王建乐 1 前言 在日常开发工作中,我们经常用Mybatis Generator根据表结构生成对应的实体类和Mapper文件。但是Mybatis Generator默认生成的代码中,注释并不是我们想要的,所以一般在Generator配置文件中,会设置不…

Java题目集

Java冒泡排序和查找冒泡排序,从小到达排列查找,某一个字符串输出如下数据输出杨辉三角形冒泡排序,从小到达排列 分析:数组 [15,21,20,35,10] 第 1 轮排序: 目标把最大数放在最后 第 1 次比较 [15,21,20,35,10] 第 2 次比较 [15,21,20,35,10…

目标检测 YOLOv5 - ncnn模型的加密 C++实现封装库和Android调用库示例

目标检测 YOLOv5 - ncnn模型的加密 C实现封装库和Android调用库示例 flyfish 文章目录目标检测 YOLOv5 - ncnn模型的加密 C实现封装库和Android调用库示例前言模型版本库的版本示例程序的编译环境模型的转换库的制作主要接口部分模型初始化部分推理的输入输出CMakeList的配置示…

LeetCode-878-第N个神奇数字

1、二分查找 如果我们用函数f(x)f(x)f(x)表示数字小于x的神奇数字的个数,显然我们可以得到如下的公式:f(x)⌊xa⌋⌊xb⌋−⌊xc⌋f(x)\left \lfloor \frac{x}{a} \right \rfloor\left \lfloor \frac{x}{b} \right \rfloor-\left \lfloor \frac{x}{c} \ri…

门店管理|火锅店数字化系统转型

火锅几乎是每个人的最爱,吃着火锅喝着酒,生活日子乐逍遥。在很多火锅店里,我们经常可以看见客人爆满。虽然这几天疫情的冲击导致不少餐饮商家生存很难,但随着对疫情的有效控制,餐饮行业正在回暖。 无论以前还是现在&am…

艾美捷 DetergentOUT GB-S10去垢剂的特点和多种应用

去垢剂,亦有称为清洁剂,主要成分是表面活性剂(部分场合即特指表面活性剂,可分阴离子、阳离子和中性去垢剂等多种类型,中性去垢剂在蛋白提取中应用的较多),根据实际需求有时也会包括研磨剂,pH调节剂&#xf…

Spring Cloud Alibaba(一)

整合nacos 一、项目结构small-shop为父工程&#xff0c;order(订单服务)、stock(库存服务) 二、父工程pom.xml文件&#xff0c;添加基础依赖&#xff0c;控制版本 <modules><module>order</module><module>stock</module></modules><pr…

数字时代,医疗健康企业如何通过数字营销创造用户价值

前言&#xff1a;数字化时代&#xff0c;数字营销为企业深入洞察用户需求、把握用户画像、与用户建立有效互动提供了可能性&#xff0c;从而帮助企业实现降本增效的精细化营销&#xff0c;大大提升企业的经营效率。对医疗健康企业来说&#xff0c;因其行业和需求的特殊性&#…

数据结构--单链表

1.定义 由于顺序表的插入删除操作需要移动大量的元素&#xff0c;影响了运行效率&#xff0c;因此引入了线性表的链式存储——单链表。单链表通过一组任意的存储单元来存储线性表中的数据元素&#xff0c;不需要使用地址连续的存储单元&#xff0c;因此它不要求在逻辑上相邻的…

携手!Kyligence 支持 Amazon EMR Serverless,赋能云上企业降本增效

近日&#xff0c;Kyligence 与亚马逊云科技宣布 Kyligence Cloud 4.6 正式支持 Amazon EMR Serverless&#xff0c;共同助力企业构建高效、低成本云上数据分析。今天&#xff0c;我们将为大家介绍 Kyligence Cloud 4.6 如何通过集成 Amazon EMR Serverless 提供端到端的云上数…

字节给我狠狠上了一课:危机来的时候你连准备时间都没有~

各大互联网公司的接连裁员&#xff0c;政策限制的行业接连消失&#xff0c;让今年的求职雪上加霜&#xff0c;想躺平却没有资本&#xff0c;还有人说软件测试岗位饱和了&#xff0c;对此很多求职者深信不疑&#xff0c;因为投出去的简历回复的越来越少了。甚至还有不少大厂直接…