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,一经查实,立即删除!

相关文章

社区发现之标签传播算法(LPA)

在Graph领域,社区发现(Community detection)是一个非常热门且广泛的话题,后面会写一个系列,该问题实际上是从子图分割的问题演变而来,在真实的社交网络中,有些用户之间连接非常紧密,有些用户之间的连接较为稀疏,连接紧密的用户群体可以看做一个社区,在风控问题中,可…

Go语言调用身份证实名认证API方法-标准版身份证实名认证接口

翔云身份证实名认证接口具备高准确度的身份信息比对能力,包括姓名、身份证号码、人脸照片等信息的一致性验证,并能实时反馈验证结果。 以下是GO语言调用翔云身份实名认证API的代码: package mainimport ("fmt""bytes"&q…

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

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

Java模板方法模式:定义骨架,允许子类定制行为

Java模板方法模式&#xff1a;定义骨架&#xff0c;允许子类定制行为 摘要&#xff1a;模板方法模式是一种行为设计模式&#xff0c;它在一个方法中定义了一个算法的骨架&#xff0c;允许子类在不改变算法结构的情况下重定义某些步骤的具体内容。本文将详细介绍Java中实现模板…

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

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

uniapp:APP端webview拦截H5页面跳转,华为市场发布需要限制webview的H5页面跳转

在使用uniapp开发APP项目时&#xff0c;华为市场上线APP会被打回来&#xff1a;您的应用内容存在点击跳转至第三方应用市场或游戏中心下载渠道的问题&#xff0c;不符合华为应用市场审核标准。 华为审核指南4.6 因此可以考虑下面的处理方式&#xff0c;通过拦截webview页面的…

寒假学习总结

经过一个寒假的学习 学了许多的关于数据结构知识 栈与队列&#xff0c;优先队列&#xff0c;单调栈&#xff0c;单调队列&#xff0c;双端队列https://blog.csdn.net/2301_81794044/article/details/135871598?spm1001.2014.3001.5501深搜和广搜https://blog.csdn.net/2301_…

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;就不明白前人的一些操作。因…

FAISS+bge-large-zh在大语言模型LangChain本地知识库中的作用、原理与实践

文章目录 FAISSbge-large-zh在大语言模型LangChain本地知识库中的作用、原理与实践引言FAISS与bge-large-zh简介FAISS原理bge-large-zh原理 FAISSbge-large-zh在LangChain本地知识库中的作用提高检索效率增强语义理解能力支持大规模数据处理 实践数据准备与处理FAISS索引构建与…

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

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

Servlet(2)

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

用CSS制作弧形卡片的三种创意方法!

在平时开发中&#xff0c;有时候会碰到下面这种“弧形”样式&#xff0c;主要分为“内凹”和“外凸”两种类型&#xff0c;如下 该如何实现呢&#xff1f;或者想一下&#xff0c;有哪些 CSS 属性和“弧形”有关&#xff1f;下面介绍 3 种方式&#xff0c;一起看看吧 一、borde…

智慧校园的未来已来!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调用…