SQL语句在MySQL中如何执行

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.mzph.cn/web/62671.shtml

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

相关文章

ragflow连不上ollama的解决方案

由于前期wsl默认装在C盘,后期部署好RagFlow后C盘爆红,在连接ollama的时候一直在转圈圈,问其他人没有遇到这种情况,猜测是因为内存不足无法加载模型导致,今天重新在E盘安装wsl 使用wsl装Ubuntu Win11 wsl-安装教程 如…

C#常见错误—空对象错误

System.NullReferenceException:未将对象引用设置到对象的实例 在C#编程中,System.NullReferenceException是一个常见的运行时异常,其错误信息“未将对象引用设置到对象的实例”意味着代码试图访问一个未被初始化或已被设置为null的对象的成…

沁恒CH32V208蓝牙串口透传例程:修改透传的串口;UART-CH32V208-APP代码分析;APP-CH32V208-UART代码分析

从事嵌入式单片机的工作算是符合我个人兴趣爱好的,当面对一个新的芯片我即想把芯片尽快搞懂完成项目赚钱,也想着能够把自己遇到的坑和注意事项记录下来,即方便自己后面查阅也可以分享给大家,这是一种冲动,但是这个或许并不是原厂希望的,尽管这样有可能会牺牲一些时间也有哪天原…

Scala的隐式对象

Scala中,隐式对象(implicit object)是一种特殊的对象,它可以使得其成员(如方法和值)在特定的上下文中自动可用,而无需显式地传递它们。隐式对象通常与隐式参数和隐式转换一起使用,以…

矩阵的乘(包括乘方)和除

矩阵的乘分为两种: 一种是高等代数中对矩阵的乘的定义:可以去这里看看包含矩阵的乘。总的来说,若矩阵 A s ∗ n A_{s*n} As∗n​列数和矩阵 B n ∗ t B_{n*t} Bn∗t​的行数相等,则 A A A和 B B B可相乘,得到一个矩阵 …

DVWA亲测sql注入漏洞

LOW等级 我们先输入1 我们加上一个单引号&#xff0c;页面报错 我们看一下源代码&#xff1a; <?php if( isset( $_REQUEST[ Submit ] ) ) { // Get input $id $_REQUEST[ id ]; // Check database $query "SELECT first_name, last_name FROM users WHERE user_id …

机器学习01-发展历史

机器学习01-发展历史 文章目录 机器学习01-发展历史1-传统机器学习的发展进展1. 初始阶段&#xff1a;统计学习和模式识别2. 集成方法和核方法的兴起3. 特征工程和模型优化4. 大规模数据和分布式计算5. 自动化机器学习和特征选择总结 2-隐马尔科夫链为什么不能解决较长上下文问…

想了解操作系统,有什么书籍推荐?

推荐一本操作系统经典书&#xff1a; 操作系统导论 《操作系统导论》虚拟化(virtualization)、并发(concurrency)和持久性(persistence)。这是我们要学习的3个关键概念。通过学习这3个概念&#xff0c;我们将理解操作系统是如何工作的&#xff0c;包括它如何决定接下来哪个程序…

[Collection与数据结构] 位图与布隆过滤器

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

微信小程序横屏页面跳转后,自定义navbar样式跑了?

文章目录 问题原因&#xff1a;解决方案&#xff1a; 今天刚遇到的问题&#xff0c;横屏的页面完成操作后跳转页面后&#xff0c;自定义的tabbar样式乱了&#xff0c;跑到最顶了&#xff0c;真机调试后发现navbar跑到手机状态栏了&#xff0c;它正常应该跟右边胶囊一行。 知道问…

Vivado ILA数据导出MATLAB分析

目录 ILA数据导出 分析方式一 分析方式二 有时候在系统调试时&#xff0c;数据在VIVADO窗口获取的信息有限&#xff0c;可结合MATLAB对已捕获的数据进行分析处理 ILA数据导出 选择信号&#xff0c;单击右键后&#xff0c;会有export ILA DATA选项&#xff0c;将其保存成CS…

《探索形象克隆:科技与未来的奇妙融合》

目录 一、什么是形象克隆 二、形象克隆的技术原理 三、形象克隆的发展现状 四、形象克隆的未来趋势 五、形象克隆的应用场景 六、形象克隆简单代码案例 Python 实现数字人形象克隆 Scratch 实现角色克隆效果&#xff08;以猫为例&#xff09; JavaScript 实现 Scratc…

MATLAB深度学习(七)——ResNet残差网络

一、ResNet网络 ResNet是深度残差网络的简称。其核心思想就是在&#xff0c;每两个网络层之间加入一个残差连接&#xff0c;缓解深层网络中的梯度消失问题 二、残差结构 在多层神经网络模型里&#xff0c;设想一个包含诺干层自网络&#xff0c;子网络的函数用H(x)来表示&#x…

前端入门之VUE--vue组件化编程

前言 VUE是前端用的最多的框架&#xff1b;这篇文章是本人大一上学习前端的笔记&#xff1b;欢迎点赞 收藏 关注&#xff0c;本人将会持续更新。 文章目录 2、Vue组件化编程2.1、组件2.2、基本使用2.2.1、VueComponent 2、Vue组件化编程 2.1、组件 组件&#xff1a;用来实现…

设计模式-装饰器模式(结构型)与责任链模式(行为型)对比,以及链式设计

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1.装饰器模式1.1概念1.2作用1.3应用场景1.4特点1.5类与对象关系1.6实现 2责任链模式2.1概念2.2作用2.3应用场景2.4特点2.5类与对象关系2.6实现 3.对比总结 前言…

操作系统:死锁与饥饿

目录 死锁概念 饥饿与饿死概念 饥饿和死锁对比 死锁类型 死锁条件&#xff08;Coffman条件&#xff09; 死锁恢复方法 死锁避免 安全状态与安全进程序列&#xff1a; 银行家算法&#xff1a; 死锁检测时机&#xff08;了解&#xff09;&#xff1a; 死锁检测 死锁案…

RPO: Read-only Prompt Optimization for Vision-Language Few-shot Learning

文章汇总 想解决的问题对CoOp的改进CoCoOp尽管提升了性能,但却增加了方差(模型的准确率波动性较大)。 模型的框架一眼看去,跟maple很像(maple跟这篇文章都是2023年发表的),但maple的视觉提示是由文本提示经过全连接转换而来的,而这里是文本提示和视觉提示是独立的。另外m…

『MySQL 实战 45 讲』24 - MySQL是怎么保证主备一致的?

MySQL是怎么保证主备一致的&#xff1f; MySQL 主备的基本原理 基本的主备切换流程 状态 1&#xff1a;客户端的读写都直接访问节点 A&#xff0c;而节点 B 是 A 的备库状态 2&#xff1a;切换时&#xff0c;读写访问的都是节点 B&#xff0c;而节点 A 是 B 的备库注意&…

自荐一部IT方案架构师回忆录

作者本人毕业于一个不知名大专院校&#xff0c;所读专业计算机科学技术。2009年开始IT职业生涯&#xff0c;至今工作15年。擅长TSQL/Shell/linux等技术&#xff0c;曾经就职于超万人大型集团、国内顶级云厂商、央国企公司。参与过运营商大数据平台、大型智慧城市ICT、云计算、人…

python数据分析之爬虫基础:selenium详细讲解

目录 1、selenium介绍 2、selenium的作用&#xff1a; 3、配置浏览器驱动环境及selenium安装 4、selenium基本语法 4.1、selenium元素的定位 4.2、selenium元素的信息 4.3、selenium元素的交互 5、Phantomjs介绍 6、chrome handless模式 1、selenium介绍 &#xff08;1…