2024年最全【MySQL进阶-09】深入理解mysql执行的底层机制_mysql底层机制,有了这些中高端面试专题-大厂还会远吗

最后

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书+2021年最新大厂面试题。
在这里插入图片描述

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

		* [1.1.2,分析器](#112_46)
		* [1.1.3,优化器](#113_50)
		* [1.1.4,执行器](#114_54)
		* [1.1.5,bin-log日志](#115binlog_58)
	- [1.2,innodb存储引擎层](#12innodb_62)
+ [2,redolog](#2redolog_86)
+ - [2.1,commit提交的原因](#21commit_88)
	- [2.2,redolog在缓存池的作用](#22redolog_92)
	- [2.3,redolog存在的意义](#23redolog_96)
	- [2.4,redolog和binlog的区别](#24redologbinlog_106)
	- [2.5,redolog总结](#25redolog_116)

一,深入理解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数据更新成功,但是磁盘数据没有更新成功的情况

最后

既已说到spring cloud alibaba,那对于整个微服务架构,如果想要进一步地向上提升自己,到底应该掌握哪些核心技能呢?

就个人而言,对于整个微服务架构,像RPC、Dubbo、Spring Boot、Spring Cloud Alibaba、Docker、kubernetes、Spring Cloud Netflix、Service Mesh等这些都是最最核心的知识,架构师必经之路!下图,是自绘的微服务架构路线体系大纲,如果有还不知道自己该掌握些啥技术的朋友,可根据小编手绘的大纲进行一个参考。

image

如果觉得图片不够清晰,也可来找小编分享原件的xmind文档!

且除此份微服务体系大纲外,我也有整理与其每个专题核心知识点对应的最强学习笔记:

  • 出神入化——SpringCloudAlibaba.pdf

  • SpringCloud微服务架构笔记(一).pdf

  • SpringCloud微服务架构笔记(二).pdf

  • SpringCloud微服务架构笔记(三).pdf

  • SpringCloud微服务架构笔记(四).pdf

  • Dubbo框架RPC实现原理.pdf

  • Dubbo最新全面深度解读.pdf

  • Spring Boot学习教程.pdf

  • SpringBoo核心宝典.pdf

  • 第一本Docker书-完整版.pdf

  • 使用SpringCloud和Docker实战微服务.pdf

  • K8S(kubernetes)学习指南.pdf

image

另外,如果不知道从何下手开始学习呢,小编这边也有对每个微服务的核心知识点手绘了其对应的知识架构体系大纲,不过全是导出的xmind文件,全部的源文件也都在此!

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

a面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/forums/4f45ff00ff254613a03fab5e56a57acb)收录**

需要这份系统化的资料的朋友,可以点击这里获取

  • 28
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值