当前位置: 首页 > ds >正文

SQL语句在MySQL的执行过程

MySQL基础架构:

先对MySQL的一些基础组件进行简单的介绍

1.连接器:身份认证和权限相关。

2.查询缓存:执行查询语句时,会先查询缓存(MySQL8.0版本后移除)。

3.分析器:词法分析和语法分析,词法分析即对一条SQL语句中的关键字进行提取,如select、insert、update、表名、字段名等等,语法分析即查看SQL语句是否有语法错误。

4.优化器:根据MySQL内部的优化算法按照最优方案执行SQL。

5.执行器:执行语句,然后从存储引擎返回数据。

MySQL主要分为server层和存储引擎层。

server层:包含连接器、查询缓存、分析器、优化器、执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图、函数等等,还有一个MySQL通用日志binlog日志模块。

存储引擎层:主要负责数据的读取和存储采用可以替换的插件式架构,支持InnoDB、MyISAM、Memory等存储引擎,其中InnoDB引擎有自带的日志模块redo log,现在最常用的存储引擎是InnoDB,从MySQL5.5之后就是MySQL的默认引擎。

说了这么多,那么SQL语句到底在MySQL中是怎么执行的呢?

SQL语句分析分为查询语句和更新语句。

查询语句

select * from tb_student  A where A.age='18' and A.name=' 张三 ';

结合上面的说明,我们来结合这条查询语句分析一下执行过程:

先查询该语句是否有权限,如果没有权限直接报错,如果有权限,在MySQL8.0版本前会查询缓存,以这条SQL语句为key看是否命中缓存,命中直接返回缓存,没有命中执行下一步。

通过分析器提取该SQL语句中的关键字,如select、from、表名tb_student、查询的列、等等,然后判断这个SQL语句是否有错误,比如关键字是否拼写错误,没有错误执行下一步。

接下来就是优化器确定执行方案,上面SQL语句有两种执行方案,a先查询年龄为18,然后查询name为张三的数据,b先查询name为张三,然后查询age为18的数据,优化器会根据内部的优化算法进行选择执行效率最高的一个方案,确定执行计划后开始执行语句。

进行权限校验,没有权限直接返回错误信息,如果有权限就会调用数据库引擎接口,返回引擎的执行结果。

更新语句

update tb_student A set A.age='19' where A.name=' 张三 ';

执行更新语句不同的是要进行日志记录了,这时候就要引进日志模块了,MySQL自带的日志是binlog日志,所有存储引擎都可以使用,InnoDB引擎有redo log日志,我们就以InnoDB引擎来分析一下这条更新语句的执行过程:

先查询出张三这一条数据,不会走查询缓存,因为更新语句会导致与该表相关的查询缓存失效。

拿到数据后将age改为19,然后调用引擎API接口,写入这一行数据,InnoDB引擎把数据保存在内存,同时记录redo log,此时redo log状态为prepare,并告诉执行器,执行完成,随时可以提交。

执行器接收通知后,记录binlog,并提交reod log。

肯定有人疑惑,这里为什么要用两个日志记录,不能用一个日志记录吗?

 主要原因如下:

功能不同:

redo log:是InnoDB特有的日志,用于保证事务的持久性。在数据库发生崩溃时,通过redo log可以将未持久化到磁盘的数据页恢复到内存,从而实现事务的持久化。

binlog:是MySQL server层的日志,主要用于记录数据库所有的变更操作,用于数据恢复、主从复制等。

恢复需求不同:

redo log:在数据库崩溃时,能让数据库恢复到崩溃前的一致状态,确保已提交的事务不会丢失。

binlog:binlog日志主要进行从某个位置或某个时间点恢复到另一个位置和时间点的恢复。

总结:

只用redo log或binlog无法同时满足以上的功能和恢复需求,所以要同时使用redo log和binlog。

http://www.xdnf.cn/news/8572.html

相关文章:

  • 行贿罪案件(公安侦查阶段)询问笔录发问提纲
  • Solana 数据实时访问的三大工具对比:哪种最适合你的应用?
  • Day34打卡 @浙大疏锦行
  • debian12下安装搜狗输入法
  • 计算机系统结构1-3章节 期末背诵内容
  • Keil调试(2)不停止调试
  • 算法修仙传 第二章 坊市奇遇:链表操作入门
  • sessionStorage 和localStorage
  • Lock锁
  • 2025.05.22-携程春招机考真题解析-第一题
  • 思 维 方 式
  • 生产环境CPU飙升问题排查与优化实战
  • 后端环境配置
  • C/C++的OpenCV 进行轮廓提取
  • FastAPI 入门指南
  • 阿里通义千问3(Qwen3)开源掀桌子(附完整使用教程)
  • PET,Prompt Tuning,P Tuning,Lora,Qlora 大模型微调的简介
  • AI编程对传统软件开发的冲击和思考
  • 【Python数据库全栈指南】从SQL到ORM深度实践
  • youyu:91501
  • 互联网大厂Java求职面试:Spring Boot 3.2+自动配置原理、AOT编译及原生镜像
  • 嵌入式系统C语言编程常用设计模式---参数表驱动设计
  • 快排-P1923求第 k 小的数
  • 开发指南117-文字阴影特效
  • 七彩喜康养护理——科技赋能下的全周期健康守护
  • 60道Angular高频题整理(附答案背诵版)
  • 动态防御体系实战:AI如何重构DDoS攻防逻辑
  • 实时操作系统革命:实时Linux驱动的智能时代底层重构
  • 向量数据库该如何选择?Milvus 、ES、OpenSearch 快速对比:向量搜索能力与智能检索引擎的应用前景
  • 小白学习顺序表 之 通讯录实现