SQL语句在MySQL中如何执行

news2025/2/25 5:23:23
MySQL的基础架构

首先就是客户端,其次Server服务层,大多数MySQL的核心服务都在这一层,包括连接、分析、优化、缓存以及所有的内置函数(时间、日期、加密函数),所有跨存储引擎功能都在这一层实现:存储过程、触发器、视图等;最后存储引擎层,负责MySQL中数据的存储和提取,Server层通过API与存储引擎进行通信,这些接口屏蔽了不同存储引擎之间差异,使得这些差异对上层(Server)的查询过程比较透明(清晰,没有阻碍,差异不存在一样)。

SQL语句在MySQL中如何执行
  • 客户端发送SQL查询语句到MySQL的服务器

  • MySQL服务器的连接器开始处理这个请求,跟客户端建立连接,获取权限,管理连接

  • (Mysql8.0之前还有查询缓存,不过后面数据不一会就变更需要更新缓存,就显得鸡肋了点,就删除了)

  • 使用解析器(分析器)去对SQL语句进行解析,检查语法规则,确保引用的数据库、表和列都存在,并处理SQL语句中的名称解析和权限验证。(首先词法分析,然后语法分析和分析机不断循环遍历关键字添加到语法树中,生成语法树)

  • 使用优化器负责确定SQL语句的执行计划,这包括选择使用哪些索引,以及决定表之间的连接顺序,会尝试找出最高效的方式来执行查询。

  • 执行器会调用存储引擎的API来进行数据的读写(使用锁)

  • 在引擎层中写一个undolog版本链用于MVCC回滚

    写redolog,写下所有命令,用于故障恢复

    若有开启binlog,这时会写binlog用于主从同步

    提交事务,刷redolog进磁盘,刷binlog进磁盘,二阶段提交保证数据一致性。

  • MySQL的存储引擎是插件式的,不同的存储引擎在细节上面有很大不同,如InnoDB支持事务,MyISAM不支持。将执行结果返回给客户端

  • 客户端接收到查询结果,完成这次查询请求。

详细讲解
  1. 客户端发送 SQL 查询语句到 MySQL 服务器及连接器处理

    • 连接建立
      • 客户端通过网络发送 SQL 查询语句到 MySQL 服务器指定的端口(通常是 3306)。服务器的连接器首先会处理这个连接请求。它会验证客户端提供的连接参数,包括主机地址、端口、用户名和密码。例如,当使用 MySQL 命令行客户端连接时,用户输入mysql -h [服务器地址] -u [用户名] -p,然后输入密码,服务器会根据配置文件(如user表中的用户记录)来检查用户名和密码是否匹配。
    • 权限获取
      • 一旦连接通过验证,连接器会根据用户账户的权限设置来确定该用户对数据库的操作权限。这些权限包括对特定数据库、表、列的读取、写入、修改等权限。例如,一个用户可能被授予对某个数据库中某些表的SELECTINSERT权限,但没有DELETE权限。权限信息存储在 MySQL 的系统数据库(如mysql数据库中的相关权限表)中,连接器会查询这些表来获取用户的权限范围。
    • 连接管理
      • 连接器会维护连接的状态,包括跟踪连接是否处于活动状态、是否超时等。它还会管理连接池(如果配置了连接池),在有多个客户端连接时,合理地分配和复用连接资源。例如,当一个客户端长时间没有发送任何请求时,连接器可能会根据服务器的配置(如wait_timeout参数)来判断是否关闭该连接,以释放资源。
  2. SQL 语句解析(解析器处理)

    • 词法分析
      • 解析器首先进行词法分析,它会将 SQL 语句分解为一个个的单词(也称为词法单元)。例如,对于语句SELECT * FROM users WHERE age > 30,解析器会将其分解为SELECT*FROMusersWHEREage>30等词法单元。这些词法单元是 SQL 语法的基本组成部分,解析器会根据预定义的词法规则(如关键字、标识符、常量、操作符等的规则)来识别它们。
    • 语法分析和语法树生成
      • 在完成词法分析后,解析器会进行语法分析。它会根据 SQL 的语法规则来检查这些词法单元的组合是否合法。解析器会使用一种类似于状态机的机制,不断循环遍历这些关键字和符号,按照语法规则构建一个语法树。例如,在上述语句中,解析器会识别出SELECT是查询操作的关键字,*表示选择所有列,FROM指定了要查询的表是usersWHERE引导了筛选条件。它会将这些信息构建成一个层次结构的语法树,其中SELECT节点是根节点,它的子节点包括*和一个表示FROM子句的节点,FROM子句节点的子节点是users,还会有一个表示WHERE子句的分支,其下包含age>30等节点。在这个过程中,解析器还会检查引用的数据库、表和列是否存在。例如,它会查询数据库的元数据(存储在系统表中)来验证users表是否存在,以及age列是否是users表中的列。同时,也会进行名称解析和权限验证。如果用户没有对users表的SELECT权限,解析器会返回权限错误。
  3. 优化器确定执行计划

    • 索引评估
      • 优化器会首先查看 SQL 语句中涉及的表和列是否有可用的索引。例如,对于查询SELECT * FROM users WHERE username = 'john',如果username列有索引,优化器会考虑使用该索引来加速查询。它会评估索引的类型(如 B - Tree 索引、哈希索引等)、索引的选择性(即通过索引能够过滤掉多少数据)等因素。例如,一个索引的选择性高意味着通过该索引能够快速定位到少量满足条件的数据行,优化器会更倾向于使用这样的索引。
    • 表连接顺序确定
      • 当 SQL 语句涉及多个表的连接时,优化器会决定表之间的连接顺序。例如,对于连接查询SELECT * FROM table1 JOIN table2 ON table1.id = table2.id JOIN table3 ON table2.id = table3.id,优化器会根据表的大小(通过统计信息,如每个表的行数)、索引情况等来判断先连接哪两个表更高效。如果table1是一个小表,并且id列有索引,而table2table3相对较大,优化器可能会先将table1table2进行连接,然后再连接table3,以减少中间结果集的大小,提高查询效率。
    • 执行计划生成和评估
      • 优化器会生成多种可能的执行计划,并根据成本模型来评估每个执行计划的成本。成本模型会考虑多种因素,如磁盘 I/O 操作次数、CPU 计算量、内存使用等。例如,一个需要进行大量磁盘扫描的执行计划成本可能较高,而一个能够充分利用索引、减少磁盘 I/O 的执行计划成本较低。优化器会选择成本最低的执行计划作为最终的执行计划,这个计划将指导执行器如何进行数据的读写操作。
  4. 执行器调用存储引擎 API 进行数据读写(使用锁)

    • 读写操作启动
      • 执行器根据优化器确定的执行计划,开始调用存储引擎的 API 进行数据的读写操作。例如,对于查询操作,执行器会按照计划从存储引擎中读取数据。如果执行计划是进行全表扫描,执行器会通过存储引擎的接口逐行读取表中的数据;如果是利用索引进行查询,执行器会通过索引接口快速定位到满足条件的数据行。
    • 锁的使用
      • 在进行数据读写时,执行器会根据 SQL 语句的性质(如是否是事务中的操作、是否涉及并发访问等)和存储引擎的锁机制来使用锁。例如,在 InnoDB 存储引擎中,如果执行一个SELECT... FOR UPDATE语句,执行器会对查询结果集对应的行加上排他锁(X 锁),以防止其他事务同时修改这些行。对于并发的事务,锁可以保证数据的一致性和完整性。不同的存储引擎有不同的锁机制,执行器会根据存储引擎的规则来正确地获取和释放锁。
  5. 引擎层 MVCC 回滚相关操作(undolog 版本链)

    • 版本链创建
      • 在 InnoDB 存储引擎中,为了支持多版本并发控制(MVCC),会为每一行数据创建一个版本链。当对一行数据进行修改时,存储引擎不会直接覆盖原来的数据,而是会将修改前的数据作为一个旧版本,通过一个链表结构(版本链)将旧版本和新版本连接起来。例如,最初有一行数据(id = 1, value = 'A'),当将value修改为'B'时,会在存储引擎中保留旧版本(id = 1, value = 'A'),并创建一个新版本(id = 1, value = 'B'),这两个版本通过版本链连接。
    • MVCC 和回滚操作
      • MVCC 允许不同事务在不同时间点看到同一行数据的不同版本。在事务执行过程中,如果需要回滚操作,存储引擎可以根据 undolog 版本链找到事务修改之前的数据版本,将数据恢复到事务开始之前的状态。例如,一个事务读取了(id = 1, value = 'A'),然后另一个事务将value修改为'B',如果第一个事务设置了隔离级别为可重复读(REPEATABLE READ),它仍然可以看到(id = 1, value = 'A')这个版本的数据。如果第二个事务需要回滚,存储引擎可以通过 undolog 版本链将数据恢复为(id = 1, value = 'A')
  6. 日志相关操作(redolog 和 binlog)

    • redolog 记录
      • redolog 用于记录数据库的物理修改操作,它是一种基于磁盘的日志。在执行对数据的修改操作(如插入、更新、删除)时,存储引擎会先将修改操作记录到 redolog 中。例如,当执行UPDATE users SET age = 31 WHERE id = 1时,存储引擎会将这个修改操作的相关信息(如修改的表、列、新值和旧值等)记录到 redolog 中。redolog 采用了预写式日志(WAL)的机制,即先写日志,后修改数据,这样可以保证在数据库发生故障(如突然断电、系统崩溃等)时,通过 redolog 来恢复尚未完成的事务,保证数据的持久性。
    • binlog 记录(如果开启)
      • binlog 主要用于数据库的主从复制和数据恢复等用途。如果开启了 binlog(通过配置参数),在执行 SQL 语句时,存储引擎会将 SQL 语句(以事件的形式)记录到 binlog 中。例如,在主从复制环境中,主数据库上的每一个修改操作都会被记录到 binlog 中,然后从数据库会通过读取主数据库的 binlog 来同步数据。binlog 的记录格式有多种(如 STATEMENT、ROW、MIXED),不同的格式记录的内容和方式略有不同。例如,ROW 格式会记录每一行数据的详细修改情况,而 STATEMENT 格式会记录执行的 SQL 语句。
    • 二阶段提交保证数据一致性
      • 在事务提交时,MySQL 会使用二阶段提交(2PC)来保证 redolog 和 binlog 的一致性。首先,存储引擎会准备好提交事务,将事务的状态设置为可以提交,这个过程会涉及到将 redolog 从内存刷到磁盘(部分情况下)等操作。然后,在确保 redolog 已经准备好提交后,才会将 binlog 也刷到磁盘。只有当 redolog 和 binlog 都成功写入磁盘后,事务才真正提交成功。这样可以保证在数据库恢复或者主从复制过程中,数据的一致性和完整性。
  7. 提交事务及返回结果给客户端

    • 事务提交
      • 当所有的数据读写操作完成,日志也按照要求记录后,执行器会提交事务。在提交事务过程中,会根据前面提到的二阶段提交机制,确保数据的一致性。如果在提交过程中出现问题(如磁盘满、网络故障等),事务可能会根据日志进行回滚,以保证数据的完整性。
    • 结果返回
      • 对于查询操作,存储引擎将查询到的数据结果集返回给执行器,执行器再将结果返回给服务器的连接器,最后由连接器将结果发送给客户端。客户端接收到查询结果后,可以根据自己的需求进行处理,例如在命令行中显示结果、在图形化客户端中以表格形式展示结果等。对于非查询操作(如插入、更新、删除),如果操作成功,会返回相应的成功信息(如受影响的行数)给客户端,完成这次查询请求。

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

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

相关文章

开源低代码平台-Microi吾码-表单控件数据源绑定配置

表单控件数据源绑定配置 平台简介普通数据源数据源引擎Sql数据源通过其它字段来动态绑定数据源关于绑定数据源后的显示字段和存储字段 平台简介 技术框架:.NET8 Redis MySql/SqlServer/Oracle Vue2/3 Element-UI/Element-Plus平台始于2014年(基于Av…

Y3编辑器文档4:触发器1(对话、装备、特效、行为树、排行榜、不同步问题)

文章目录 一、触发器简介1.1 触发器界面1.2 ECA语句编辑及快捷键1.3 参数设置1.4 变量设置1.5 实体触发器1.6 函数库与触发器复用 二、触发器的多层结构2.1 子触发器(在游戏内对新的事件进行注册)2.2 触发器变量作用域2.3 复合条件2.4 循环2.5 计时器2.6…

Redis原理—4.核心原理摘要

大纲(9870字) 1.Redis服务器的Socket网络连接建立 2.Redis多路复用监听与文件事件模型 3.基于队列串行化的文件事件处理机制 4.完整的Redis Server网络通信流程 5.Redis串行化单线程模型为什么能高并发 6.Redis内核级请求处理流程与原理 7.Redis通信协议与内核级请求数据…

轻量级日志管理平台:Grafana Loki搭建及应用(详细篇)

前言 Grafana Loki是Grafana Lab团队提供的一个水平可扩展、高可用性、多租户的日志聚合系统,与其他日志系统不同的是,Loki最初设计的理念是为了为日志建立标签索引,而非将原日志内容进行索引。 现在目前成熟的方案基本上都是:L…

【规范一】JAVA静态代码规范

1.规范的划分 将Java代码规范分为 风格规范 和 质量规范 ,主要是因为这两种规范关注的方面不同,各自解决的问题也不同。下面详细解释为什么需要将代码规范分为这两种 1.1 风格规范(Coding Style Guidelines) 风格规范主要关注代码…

Angular由一个bug说起之十二:网页页面持续占用CPU过高

随着网络日益发达,网页的内容也更加丰富,形式也更加多样化。而随之而来的性能问题也不容小觑。这篇文章我会根据我在实践中遇到的一个问题来总结,我在面对性能问题的一些解决步骤,希望能对大家有所启发。 查找问题原因 我接触的…

WordPress全能CDN插件_自动刷新预热_缓存优化|国内国外集成CDN配置

WordPress全网独家原创CDN插件 自动刷新预热 缓存优化 国内国外集成CDN配置 支持白山云 cdnfly Cloudflare PS:目前国内集成了CDNfly,白山云国外集成了Cloudflare,更新手动刷新,全站刷新,优化提交线程,根据网友建议适配阿里云,le…

唇形同步视频生成工具:Wav2Lip

一、模型介绍 今天介绍一个唇形同步的工具-Wav2Lip;Wav2Lip是一种用于生成唇形同步(lip-sync)视频的深度学习算法,它能够根据输入的音频流自动为给定的人脸视频添加准确的口型动作。 (Paper) Wav2Lip模型…

【汽车】-- 燃油发动机3缸和4缸

3缸和4缸燃油发动机是小轿车常见的发动机配置。以下从结构特点、性能、经济性等方面对两者进行对比,并分析优缺点及使用注意事项: 1. 结构与运行原理 3缸发动机 特点:少一个气缸,内部零部件更少,整体结构更紧凑。优点…

[NeurlPS 2022] STaR 开源代码实现解读

STaR 方法代码开源,这里给出一个中文代码解读地址:repo入口点:iteration_train.py;关键代码:device_train.py, device_inference.py, and create_finetune_tfrecords.py;基于 JAX、RAY,在 Googl…

欢迪迈手机商城设计与实现

文末获取源码和万字论文,制作不易,感谢点赞支持。 题目:欢迪迈手机商城设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管…

【鸿蒙实战开发】数据的下拉刷新与上拉加载

本章介绍 本章主要介绍 ArkUI 开发中最常用的场景下拉刷新, 上拉加载,在本章中介绍的内容在实际开发过程当中会高频的使用,所以同学们要牢记本章的内容。下面就让我们开始今天的讲解吧! List 组件 在 ArkUI 中List容器组件也可以实现数据滚动的效果&a…

UnityShaderLab 实现程序化形状(一)

1.实现一个长宽可变的矩形: 代码: fixed4 frag (v2f i) : SV_Target{return saturate(length(saturate(abs(i.uv - 0.5)-0.13)))/0.03;} 2.实现一个半径可变的圆形: 代码: fixed4 frag (v2f i) : SV_Target{return (distance(a…

高阶数据结构--B树B+树实现原理B树模拟实现--Java

目录 一、B-树概念 二、B-树插入分析 1.用序列{53, 139, 75, 49, 145, 36, 101}构建B树的过程如下: 2.插入过程总结 三、B树插入实现 四、B树 1.B树概念 2.B树的特性 五、B树应用 1.索引 2.Mysql索引 3.InnoDB 一、B-树概念 1970 年, R.Bayer 和…

网络安全——防火墙

基本概念 防火墙是一个系统,通过过滤传输数据达到防止未经授权的网络传输侵入私有网络,阻止不必要流量的同时允许必要流量进入。防火墙旨在私有和共有网络间建立一道安全屏障,因为网上总有黑客和恶意攻击入侵私有网络来破坏,防火…

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 多图推理

基于Qwen2-VL模型针对LaTeX OCR任务进行微调训练 - 多图推理 flyfish 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_LoRA配置如何写 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_单图推理 基于Qwen2-VL模型针对LaTeX_OCR任务进行微调训练_-_原模型_单图推理 基于Q…

Ant Design Pro实战--day01

下载nvm https://nvm.uihtm.com/nvm-1.1.12-setup.zip 下载node.js 16.16.0 //非此版本会报错 nvm install 16.16.0 安装Ant Design pro //安装脚手架 npm i ant-design/pro-cli -g //下载项目 pro create myapp //选择版本 simple 安装依赖 npm install 启动umi yarn add u…

一、为什么要学习麒麟?

麒麟认证:开启职业晋升之门 当前,就业难已经成为一个普遍的社会问题。许多大学生毕业后面临着找工作的困境,他们往往发现自己很难找到满意的职位。即使有幸找到了工作,也经常需要应对工作压力大、薪资低等问题。除此之外&#xff…

python如何减小维度

ravel():将多维数组拉平(一维)。 flatten():将多维数组拉平,并拷贝一份。 squeeze():除去多维数组中,维数为1的维度&…

未来已来:人工智能如何重塑我们的生活与工作

引言 未来的生活和工作场景正从想象走向现实。想象一下,一个清晨,语音助手已经为你安排好一天的任务,自动驾驶汽车准时送你上班,智能冰箱提醒你需要补充的食材。曾经只存在于科幻小说中的场景,如今正在我们的身边实现。…