深入理解mysql执行的底层机制

news2024/10/7 12:23:29

MySql系列整体栏目


内容链接地址
【一】深入理解mysql索引本质https://blog.csdn.net/zhenghuishengq/article/details/121027025
【二】深入理解explain以及索引优化https://blog.csdn.net/zhenghuishengq/article/details/124552080
【三】深入理解mysql事务本质https://blog.csdn.net/zhenghuishengq/article/details/127753772
【四】深入理解mvcc机制https://blog.csdn.net/zhenghuishengq/article/details/127889365
【五】深入理解mysql执行的底层机制https://blog.csdn.net/zhenghuishengq/article/details/128100377
【六】深入理解mysql集群的高可用机制https://blog.csdn.net/zhenghuishengq/article/details/126239652

一条mysql的更新语句

  • 一,深入理解mysql底层运行机制
    • 1,mysql的更新语句的执行流程
      • 1.1,server层
        • 1.1.1,连接器
        • 1.1.2,分析器
        • 1.1.3,优化器
        • 1.1.4,执行器
        • 1.1.5,bin-log日志
      • 1.2,innodb存储引擎层
    • 2,redolog
      • 2.1,commit提交的原因
      • 2.2,redolog在缓存池的作用
      • 2.3,redolog存在的意义
      • 2.4,redolog和binlog的区别
      • 2.5,redolog总结

一,深入理解mysql底层运行机制

在上一篇详细的的描述了mvcc的机制:https://blog.csdn.net/zhenghuishengq/article/details/127889365?spm=1001.2014.3001.5501

得知mvcc解决了当前事务在开启之后,提交之前,查询出来的值可以不受其他事务的增删改的影响,可以一直保持不变,从而保证事务的隔离性。mvcc主要是利用了一条公共的 undolog 版本控制链路和多个在不同条件下生成的 readview 视图组成,在更新一条sql时,需要使用到这个undolog这个日志文件。

因此接下来主要了解一下在一条sql的更新语句中,undolog 是在何时使用,还有redologbinlog等日志文件在何时使用以及他们的作用。

1,mysql的更新语句的执行流程

如下,主要是对这条sql语句进行一个解析,并且保证这个name字段是一个唯一键

update user set name = huisheng where name = zhs;

接下来描述一条sql语句的执行流程,其流程主要分为server层和引擎层两部分。server层是所有的存储引擎共享的,引擎层是由不同的存储引擎构成,如innodb,myIsam和memory等这几种,其不同的引擎有着不同的数据结构。这里主要分析Innodb这个引擎层。其流程主要如下图

在这里插入图片描述

1.1,server层

1.1.1,连接器

首先客户端和服务端建立连接之后才能发送命令,基于tcp的webSocket实现,同时会对用户的权限与密码做一个校验。mysql里面有一个系统库,里面有一张系统表user表,然后会对输入的这个host,password进行一个校验,校验成功之后进行连接,mysql会开辟一个专属的会话空间,用于临时操作。建立连接之后默认长连接时间为8小时。主要是为了建立连接以及权限校验

1.1.2,分析器

会有一些词法分析,语法分析,语义分析等。最后可以通过一个语法树,来分析具体的某一条sql语句,如select,delete,insert等。主要是对sql进行一个语法分析,看语句是否合法

1.1.3,优化器

在表里面存在多个索引的时候,会去判断走哪个索引。主要是对sql语句的一些优化

1.1.4,执行器

会进行一个权限的认证,判断一下是否有操作这张表的权限,如果有权限的话,就会去遍历表里面的每一行,看是否符合这个条件查询,如果符合,就把这行加入到结果集里面。并且通过表所对应的结构调用对应的执行引擎。

1.1.5,bin-log日志

记录mysql的执行语句,如增删改查等,以及执行后的结果集影响,主要是记录一条语句的原始逻辑。而且这个binlog是在server层公用的,因此不管引擎层是innodb还是myIsam,都需要使用到这个binlog日志。以及后期需要的主从复制原理,都是需要通过这个binlog日志实现

1.2,innodb存储引擎层

引擎层主要的引擎有innodb,myIsam和memory等这几种,mysql默认使用的是innodb这种引擎。mysql主要就是通过这个引擎层来实现横向扩展的,让server层大家共享,不同的引擎层的底层有着不一样的数据结构,从而实现mysql的多元化。然后通过这个执行器,mysql表对应的是什么引擎,那么执行器就会调用对应的存储引擎去查对应的值。

接下来详细的说一下在innodb这个引擎中,一条sql的更新语句的具体的执行流程。如上图对应的红色标注,其流程如下图

1,首先将这个 name = zhs 所在的这一页数据从磁盘中加载到BuferfPool的缓存池里面。(在mysql数据库中,数据交互以页为最小单位),此时缓存池中的name = zhs。

2,将当前要被修改的值加入到 undolog 日志文件里面,如果事务提交失败导致回滚,就用里面的这个值进行回滚。

3,在缓存池中更新数据,将name的值更新为huisheng,此时bufferpool缓存中的name = huisheng。

4,将缓存池中的操作加入到redolog的缓冲区里面,redolog里面记录了Buffer pool缓存池中对name的操作和结果

5,当Redolog缓冲区里面的数据达到一定量的时候,就会准备提交事务,并将这个redolog日志写入磁盘里面

6,将server层的binlog日志写入磁盘中,并且也会准备提交事务。准备提交的意思就是说如果在JAVA代码中,由于将这个事务的开启,提交和回滚都通过aop的方式交给了spring管理,那在一条更新语句之后可能还有其他的代码要执行,因此不能立马提交,只能说准备提交。

7,当server层的binlog将数据写成功之后,binlog会向引擎层的redolog写一个commit的标记,保证两个文件数据的一致性,然后再真正的提交事务。此时提交事务时,数据在buffer pool缓存池中并没有存入到磁盘中

8,事务提交成功之后,mysql内部会启动一个后台的IO线程,然后将BufferPoll线程池中的值进行一个随机的刷盘,将值写入到磁盘文件里面

2,redolog

2.1,commit提交的原因

在上图的第七步中,有一个commit的标记操作,主要是为了保证redolog和binlog的数据一致性。由于binlog主要是为了恢复数据的,因此binlog在不发生回滚的情况下必须要保证持久化成功。因此为了保证两个文件数据的一致性,可以让binlog在事务提交成功之后向redolog发一个commit标记,然后redolog这边接收到这个commit标记之后,redolog再提交事务。这样就可以保证两个文件里面的数据一样了。其原理有点类似主从复制的底层。

2.2,redolog在缓存池的作用

在这个innodb的存储引擎里面,有一个redolog buffer和一个redolog持久化文件,类似于一个两阶段提交,其第一阶段是为了起到一个缓存作用,并且降低持久化到磁盘的压力。第二阶段是一个批量持久化的过程,在数据达到一定量的时候,会将数据持久化到磁盘里面。

2.3,redolog存在的意义

那到了这里,相信大家都会和我一样在想,为什么有了 binlog 这个持久化的文件,还要有 **redolog ** 这个恢复数据的文件呢?
在这里插入图片描述
如果没有redolog这个日志文件,那么就会成为上面的样子,在更新完成之后,在binlog写入磁盘之后就会提交事务,那么此时就会通过内部的IO线程将值进行一个刷盘操作,从而将值写入到磁盘里面。

那么就会有一个问题,如果在innodb引擎层没有做任何日志记录,而只在server层进行了一个日志持久化的记录,当binlog事务提交之后,就会直接进入上图的第五步,server层就会默认的认为数据库已经将值从buffer pool缓冲区通过刷盘的方式加入到数据库了,而就在这个刷盘的同时,如果出现服务器突然宕机的情况,那么这个IO线程没来的及将数据加入到磁盘里面,那么就可能出现buffer poll数据更新成功,但是磁盘数据没有更新成功的情况

到此为止,本人还是蒙的,总觉得就算没有redolog,也可以通过binlog进行一个数据恢复的呀,因为当时我觉得redolog里面存储的数据在binlog这个文件里面都有。一开始并没有绕过这个弯子,直到了解binlog的作用以及他们的区别之后,才发现用这个binlog恢复这个bufferpool的线程池的数据,那肯定是行不通的。

2.4,redolog和binlog的区别

1,首先binlog是在server层的数据,即使不是innodb这个引擎,binlog这个文件也是会有的;而redolog是innodb引擎层中的日志数据

2,binlog文件是用二进制文件进行数据的存储的,并且里面记录的是一些逻辑日志;redolog记录的是物理日志,会记录具体在哪一页改了什么

3,binlog是用于恢复整个mysql的数据的,因此里面是可以追加写入的,并不会覆盖以前的日志;但是这个redolog日志大小是固定的,里面是采用这种循环覆盖的方式存储数据,就类似与从头往尾写,写满了就将头部的覆盖掉,继续从头写,并且redolog里面就只记录未刷盘的文件。

2.5,redolog总结

分析到这里,就可以知道redolog日志的作用了吧,首先再来看看之前上面提出的问题,就是在数据刷盘的时候,突然mysql服务器宕机了,此时buffer pool的数据还没有刷到磁盘文件里面,那必然会丢失一部分数据,那怎么去恢复这个丢失的数据呢?

首先先来解决我之前的疑惑,就是为什么我上面觉得binlog也可以用来恢复数据,现在突然觉得又不行了呢,依旧结合着图和理论分析:

在这里插入图片描述

1,binlog是server层数据,如上图,binlog提交事务之后才将数据从buffer pool缓存池中将数据刷盘到磁盘文件中,此时binlog日志并不管你刷盘的事情。因此不能记录哪些数据刷盘了哪些数据没刷盘,如果使用binlog来恢复磁盘文件,那么就会将全部的数据重新运行一遍,已经存在磁盘的数据又会再存一遍。那么此时数据肯定会重复了。

2,binlog毕竟是server层的数据,不可能为了innodb这一个存储引擎专门做一个标记位来标记那些已经刷盘哪些未刷盘吧,并且只为了恢复你那buffer pool那一点数据专门让binlog做一个标记是否刷盘的也不合适。

3,redolog是采用覆盖的数据结构,只存未刷盘的数据,已经刷入磁盘的数据都会从 redolog 这个有限大小的日志文件里删除。这样即解决了1,2数据刷盘导致数据重复的问题,也解决了服务层和引擎层跨层恢复数据的问题,这样通过redolog恢复这个buffer pool缓存池的数据再合适不过了。

这就解释了为啥要有这个redolog这个文件了,就是在宕机时,或者数据丢失时可以快速恢复buffer pool中的未刷盘的数据了。

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

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

相关文章

3dmax如何进行网络渲染?网渲云渲染渲染农场怎么用?

渲染本身是将3d模型转换为2d图像的一个过程,而网络渲染就是把3d模型放在云端进行完成,而本地我们只需要等待结果就好。而云渲染也就是网渲的标准称呼,两个是一个意思。 那怎么进行网络渲染呢? 首先我们需要下载网络渲染客户端&a…

03-Docker-Docker镜像的分层概念

目录 一、镜像是什么 二、UnionFS(联合文件系统) 三、Docker镜像加载原理 四、将容器生成为镜像Commit命令 一、镜像是什么 是一种轻量级、可执行的独立软件包,包含运行某个软件所需的所有内容,我们把应用程序和配置依赖打包好…

TextBox文本框与PasswordBox密码框水印

在开发一个软件和网页的时候,都会有一个功能,那就是登陆功能,有了登陆那就一定需要用户输入账号和密码,我们在写登陆页面都会想到使用TextBox和PasswordBox去完成这两个功能,但是有一个问题,那就是如果你使…

java EE初阶 — 线程的状态

文章目录1.状态的基本认识2.观察线程的所有状态3.线程状态和状态转移4.多线程的意义1.状态的基本认识 NEW 创建了 Thread 对象,但是还没调用 start(内核里还没有创建对应的PCB)TERMINATED 表示内核中的 PCB 已经执行完毕了,但是 …

zabbix监控触发器与报警动作

目录 一、环境准备 1、搭建zabbix基础环境 2、创建被监控主机 二、触发器概念 三、创建触发器 1、创建触发器步骤 2、触发器表达式 (1)表达式格式 (2)表达式函数 3、配置触发器 四、创建报警动作 1、设置邮箱服务器 …

学生选课系统

项目描述 通过项目背景的分析以及了解到现在学校面临的问题,特别需要一个选课管理系统保证学生信息以及各种课程成绩的准确性和实效性,通过利用计算机的高速计算和快速的统计分析,保证学生信息的最新记录。从教职工的角度老考虑,…

网络套接字编程(UDP协议)

文章目录预备知识socket(网络套接字)编程接口简单的UDP网络程序增加多用户可以互相通信预备知识 网络字节序 大端存储:数据的高字节内容保存在内存的低地址处,数据的低字节内容保存在内存的高地址处 小端存储:数据的高…

婚纱预订小程序开发,商家线上展示平台

婚纱代表着纯洁与忠贞,也是爱情永恒的见证者,穿上洁白的婚纱嫁给自己心爱的人是每个女生的梦想,婚纱对于每一个女生来说都有着重要的意义,所以选择一件美丽且适合的婚纱非常重要,因此人们在选择婚纱时会花费很多的时间…

MySQL数据库之索引

目录 一、MySQL索引简介 二、索引的作用 1、优点 2、缺点 三、创建索引的原则依据 四、索引的分类和创建 1、普通索引 2、唯一索引(创建唯一键即创建唯一索引) 3、主键索引(和创建主键的方式一样) 4、组合索引&#xff…

Python标准库之copy

1. copy标准库简介 Python 中赋值语句不复制对象,而是在目标和对象之间创建绑定 (bindings) 关系。对于自身可变或者包含可变项的集合对象,我们有时会需要生成其副本用于改变操作,进而避免改变原对象。 2. copy常用函数 2.1 copy.copy(x) …

R语言用ARIMA模型滑动时间窗口识别网络流量时间序列异常值

全文链接:http://tecdat.cn/?p30597最近我们被要求解决时间序列异常检验的问题。有客户在使用大量的时间序列。这些时间序列基本上是每10分钟进行一次的网络测量,其中一些是周期性的(即带宽),而另一些则不是&#xff…

Android Jetpack Compose——一个简单的聊天界面

Jetpack Compose——聊天界面前言效果视频引入RowColumnTextImage聊天界面效果左边布局右边布局插入数据总结前言 目前声明式UI已经成为前端开发趋势,除了一开始的跨端开发React,Flutter等以及Web支持外,后续Android和IOS平台也相继推出声明式开发&…

零基础快速开发Vue图书管理系统—登录注册篇(一)

零基础快速开发Vue图书管理系统—登录注册篇(一) 一、图书管理系统项目功能 二、项目技术选型 前端主要采用:Vue3.x (vuex/vue-router)、Ant Design Vue、Axios等服务端主要采用:Node.js、Koa、Mongoose等数据库主要采用&#x…

Docker安装Redis集群失败经历汇总

在程序员的开发过程中,Redis可以说基本上是必不可少的缓存中间件。不管是二进制包还是docker安装Redis的文章在网上都是数不胜数。我之前自己玩Redis的时候基本不是二进制包安装就是docker安装,也没有尝试过集群方式。每次需要的时候,网上百度…

DataFrame转化为json的方法教程

网络上有好多的教程,讲得不太清楚和明白,我用实际的例子说明了一下内容,附档代码,方便理解和使用 DataFrame.to_json(path_or_bufNone, orientNone, date_formatNone, double_precision10, force_asciiTrue, date_unitms, defau…

考研数据结构大题整合_组一(ZYL组)

考研数据结构大题整合 目录考研数据结构大题整合一、ZYL组ZYL组一ZYL组二ZYL组三ZYL组四ZYL组五ZYL组六ZYL组七ZYL组八一、ZYL组 ZYL组一 1.一棵树有度为i的结点ni 个(i1,2,3,…m), 求叶结点的个数.(10分) 2、已知带权连通图G(V,E)的邻接表如图所示&am…

rubbitmq 图形界面使用 常用六种通信模式 Simple-Work-fanout-direct-topic-headers

阿里云服务器添加rubbitmq需要开启端口:rabbitmq阿里云服务器开放端口号 Rubbitmq地址: 服务器地址:15672 1.简单模式Simple 一个生产者、一个消费者,不需要设置交换机(使用默认的交换机) 2.工作队列模式Work Queue 一个生产者、多个消费者&a…

windows操作系统双网卡问题处理办法

windows操作系统双网卡问题处理办法(详解)一、命令说明二、处理办法1.设置外网网关为默认网关2.查看当前路由表3.删除缺省路由4.添加访问外网的缺省路由5.添加访问内网的路由信息一、命令说明 显示 IP 路由表的信息 route print显示 IP 路由表中以 192…

3.7.3、ARP协议(网际层)

地址解析协议 ARP 1、工作原理 在共享总线型的以太网中 为了简单起见:只有各主机所配置的 IP 地址和其网卡上固化的 MAC 地址 假设主机 B 要给主机 C 发送数据包 主机 B 知道主机 C 的 IP 地址,但是不知道 C 的 MAC 地址 因此,主机 B 的…

使用 Bytebase 管理 Rainbond 上的应用数据库

在应用的发布过程中数据库的结构变更一直是最复杂也是风险最大的环节,而 Bytebase 可以对这一过程进行全生命周期的管理。在 Rainbond 中安装 Bytebase,轻松管理部署在 Rainbond 上的所有数据库。 Bytebase 是什么? Bytebase 是一个开源的数…