JavaGuide-SQL在mysql中的执行过程

SQL在mysql中的执行过程

原文连接
SQL在mysql中的执行过程

基础架构概览

我们先总结基本组件
在这里插入图片描述

  • 连接器: 身份认证 + 权限相关的,我们连接的时候会验证
  • 查询缓存: 8.0之后移除,执行查询的时候,会先查缓存
  • 分析器: 分析你的sql语句,包括词法分析 + 语法分析
  • 优化器: 按照mysql认为最优的方案去执行
  • 执行器: 执行语句,然后从存储引擎中返回数据

对于mysql总的来说,分为两个模块,一个是Server层,一个是存储引擎层

  • Server层,包括连接器,分析器,优化器,执行器,查询缓存,所有跨存储引擎的功能都是在这里实现的,例如函数 + 触发器 + 存储过程 + 视图,还有一个binglog日志模块
  • 存储引擎层,就是我们熟知的innodb,或者是myisam

Server层组件介绍

连接器

类似于保安,进行用户认证,包括账号密码 + 权限,如果验证通过,会去查该用户下的所有权限,之后的权限判断都是按照这个地方查到的权限,所以,理论上来说,连接不断的化,就算改了该用户的权限,也可以用.

查询缓存

8.0之后,被删除了,原因是经常不命中,这个功能本来就很鸡肋,缓存的化,可以用很多东西进行代替,mysql这里的缓存可是所有语句所以,很多时候不会命中,也说得过去.

它的执行流程是,来了一个查询,查缓存是否有,缓存中存储形式为key-value
key是查询语句,value是结果
有缓存的化,返回
没有缓存的化,去查数据库,然后会把结果加入到缓存中

分析器

分析你的sql是干嘛的

  • 词法分析: 词法,单词的用法,也就是看你的select,查的是什么表,查询条件是什么
  • 语法分析: 看你的sql是否合法

为什么要有词法分析呢? 因为我们后边要优化啊,你都不知道sql要干嘛怎么优化?

优化器

优化器的作用就是选一条mysql自己认为最优的路,这个就大有学问了,必须得学索引相关,才能入门,这个时候会生成一个执行计划给到执行器

执行器

先看用户是否有权限,有的化,调用存储引擎的接口,返回结果

流程

对于查询语句来说,不会涉及到数据的更改,所以不用记录查询日志
对于更新操作来说,需要更新日志

查询流程

  1. 先看是否有缓存
  2. 分析器,词法分析+ 语法分析
  3. 优化器,生成执行计划
  4. 执行器,执行,调用存储引擎接口,返回结果

更新流程

对于更新语句,基本的流程和查询一致
不同的是,执行更新的时候,会记录日志

mysql自带的是binlog归档日志,innodb带的是redo log

update tb_student A set A.age='19' where A.name=' 张三 ';
  • 先查缓存,有缓存,返回结果
  • 然后拿到查询的语句,执行查询,调用引擎api,执行写入数据,innodb引擎会把数据保存在内存中,同时记录redo log,此时redo log进入prepare状态,然后告诉执行器,随时可以提交
  • 执行器收到之后记录binlog,提交redo log为提交状态

总结一致性问题

一致性问题的出现在于,我们考虑到可能发生的宕机异常,此时就容易有一致性问题

我们这里的流程是先写redo log,设置为prepare状态,然后再写binlog,最后提交redo log,这个流程很合理,因为它解决了一致性问题,为了展示这个方案的合理性,我们用反证法来看

假设,我们先写redo log,直接提交,再写binlog
如果,redo log写完提交之后,宕机了,恢复的时候,redo log里边有记录,binlog里边没有记录,之后主从同步的时候,就丢失了这个数据了,一致性问题出现

假设我们先写binlog,再写redo log
先写binlog,写完之后,宕机,恢复的时候,binlog里边有记录,redo log里边没有记录,无法恢复这条数据,也是一致性问题

对于此,redo log的两阶段提交的方式就比较合理,我们来正着来看这个方案的合理之处

假设写完redo log,此时处于prepare状态,宕机了,恢复的时候,binlog没有,redolog 有,可以做回滚操作,没有一致性问题

假设写完redo log ,此时处于prepare状态,再写binlog,写完binlog,宕机了,恢复的时候,此时就要依赖于MySQL的处理过程:

  • 判断redo log是否完整,如果完整,就直接提交
  • 如果redo log只是预提交,没有commit的化,判断binlog是否完整,如果完整提交redo log,不完整回滚

总结

查询语句的执行流程: 权限校验 查询缓存 -> 分析器 -> 优化器 -> 权限校验
更新语句的执行流程: 分析器 -> 权限校验 -> 执行器 -> 引擎 -> redo log(prepare) -> binglog -> redo-log (commit)

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

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

相关文章

vue 动态渲染本地图片不显示的解决方法

代码更改前 <img class"img" :src"/assets/images/${syntheticalGrade}.png" />data(){return{syntheticalGrade:"1"} }效果图&#xff1a; 解决代码 <img class"img" :src"require(/assets/images/${syntheticalGrad…

光纤跳线的大方头跳线、小方头跳线、圆头跳线

光纤跳线在数据中心的应用非常广泛&#xff0c;它普遍应用在光纤通信系统 、光纤接入网、光纤设备传输以及局域网等领域。在光纤通信快速 发展和各种设备需求扩大的推动下&#xff0c;更多类型的光纤跳线被研发出 以及被使用。大家可能听说过LC、SC、FC、ST等跳线&#xff0c;那…

Linux命令 - 如何查询当前已使用的内存占比

结果先行 free -h | awk NR2{printf "%.2f%%", $3*100/$2 }解释一下 这个命令组合了 free -h 和 awk 命令来输出已用内存的百分比。我们一步一步来解析这个命令&#xff1a; Step 1 free -hfree 是一个用来显示 Linux 系统内存使用情况的命令。-h 参数是 “human…

成功解决TypeError: can‘t multiply sequence by non-int of type ‘float‘

&#x1f525; 成功解决TypeError: can’t multiply sequence by non-int of type ‘float’ &#x1f4c5; 日期&#xff1a;2024年2月23日 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化…

Intel处理器虚拟化技术VT-x86下实现小型虚拟化框架(1)

一.前言 我一直觉得&#xff0c;学习计算机中的一门新技术&#xff0c;一定要从历史去了解他的全貌。这样有利于我们了解事情的来龙去脉和发展的过程。一上来直接接触新兴事物&#xff0c;很容易陷入不知从何下手的困境。不了解历史发展&#xff0c;就不明白前人的一些操作。因…

Xcode中App图标和APP名称的修改

修改图标 选择Assets文件 ——> 点击Applcon 换App图标 修改名称 点击项目名 ——> General ——> Display Name

Servlet(2)

文章目录 更方便的部署方式安装 Smart Tomcat 插件配置 Smart Tomcat 插件 访问出错怎么办出现 404出现 405出现 500出现 "空白页面"出现 "无法访问此网站" 小结 更方便的部署方式 手动拷贝 war 包到 Tomcat 的过程比较麻烦. 我们还有更方便的办法. 此处我…

智慧校园的未来已来!AI与数字孪生领航教育新时代

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;和数字孪生技术正逐渐渗透到我们生活的方方面面&#xff0c;而在教育领域&#xff0c;它们的结合更是催生出一种全新的智慧校园模式。这种模式的出现&#xff0c;不仅预示着教育管理方式的彻底变革&#xff0…

网络原理 - HTTP/HTTPS(5)

HTTPS HTTPS也是一个应用层协议.在HTTP协议的基础上引入了一个加密层. HTTP协议内容都是按照文本的方式明文传输的. 这就导致了在传输过程中出现了一些被篡改的情况. 臭名昭著的"运营商劫持" 下载一个天天动听. 未被劫持的效果,点击下载按钮,就会弹出天天动听的…

【linux】常见指令 -通配符,数据管道,重定向,压缩打包...

目录 前言 基本指令 ls命令 常见选项 ​编辑 pwd命令 cd 指令 常见选项 touch指令 mkdir指令 常见选项 rm 指令 常见选项 man指令 cp指令 常用选项&#xff1a; mv指令 常用选项 nano指令 如何写入且执行文件&#xff1f; cat指令 常用选项 more指令…

基于RK3399 Android11适配OV13850 MIPI摄像头

目录 1、原理图分析2、编写和配置设备树3、调试方法4、遇到的问题与解决5、补丁 1、原理图分析 从上图可看出&#xff0c;我们需要关心的&#xff0c;①MIPI数据和时钟接口使用的是MIPI_TX1/RX1 ②I2C使用的是I2C4总线 ③RST复位引脚使用的是GPIO2_D2 ④PWDN使用的是GPIO1_C7 ⑤…

【Python笔记-设计模式】外观模式

一、说明 外观模式是一种结构型设计模式&#xff0c;能为程序库、框架或其他复杂类提供一个统一的接口。 (一) 解决问题 简化复杂系统的接口调用 (二) 使用场景 简化复杂系统&#xff1a;需要一个指向复杂子系统的直接接口&#xff0c; 且该接口的功能有限时重构复杂的代码…

unity ui界面优化

优化一个比较复杂的界面&#xff0c;里面有多个rt和组件。 在初次打开这个界面的时候会发生1s多的卡顿&#xff0c;还是非常严重的。 分析 通过profiler分析 1.打开界面时卡顿。 分析&#xff1a;除了update和dotween相关逻辑&#xff0c;主要在于打开时的lua function调用…

幻兽帕鲁(Palworld 1.4.1)私有服务器搭建(docker版)

文章目录 说明客户端安装服务器部署1Panel安装和配置docker服务初始化设置设置开机自启动设置镜像加速 游戏服务端部署游戏服务端参数可视化配置 Palworld连接服务器问题总结 说明 服务器硬件要求&#xff1a;Linux系统/Window系统&#xff08;x86架构&#xff0c;armbian架构…

spring boot3登录开发-3(账密登录逻辑实现)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途。 目录 前置条件 内容简介 用户登录逻辑实现 创建交互对象 1.创建用户登录DTO 2.创建用户登录VO 创建自定义登录业务异…

如何使用ChatGPT创建一份优质简历

目录 第一步&#xff1a;明确目标和重点 第二步&#xff1a;与ChatGPT建立对话 第三步&#xff1a;整理生成的内容 第四步&#xff1a;注重行文风格 第五步&#xff1a;强调成就和量化结果 第六步&#xff1a;个性化和定制 第七步&#xff1a;反复修改和完善 总结 在现…

分类预测 | Matlab实现KPCA-ISSA-LSSVM基于核主成分分析和改进的麻雀搜索算法优化最小二乘支持向量机故障诊断分类预测

分类预测 | Matlab实现KPCA-ISSA-LSSVM基于核主成分分析和改进的麻雀搜索算法优化最小二乘支持向量机故障诊断分类预测 目录 分类预测 | Matlab实现KPCA-ISSA-LSSVM基于核主成分分析和改进的麻雀搜索算法优化最小二乘支持向量机故障诊断分类预测分类效果基本描述程序设计参考资…

【软件测试】定位前后端bug总结+Web/APP测试分析

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、Web测试中简单…

k8s-pod的介绍及命令行创建pod

一、 pod介绍 在kubernetes的世界中&#xff0c;k8s并不直接处理容器&#xff0c;而是使用多个容器共存的理念&#xff0c;这组容器就叫做pod。 pod是k8s中可以创建和管理的最小单元&#xff0c;是资源对象模型中由用户创建或部署的最小资源对象模型&#xff0c;其他的资源对象…

车载测试面试:题库+项目

车载测试如何面试&#xff08;面试技巧&#xff09;https://blog.csdn.net/2301_79031315/article/details/136229809 入职车载测试常见面试题(附答案&#xff09;https://blog.csdn.net/2301_79031315/article/details/136229946 各大车企面试题汇总&#xff08;含答案&am…