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.rhkb.cn/news/489172.html

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

相关文章

轻量化特征融合 | 一种基于增强层间特征相关性的轻量级特征融合网络 | 北理工新作

论文题目:A Lightweight Fusion Strategy With Enhanced Interlayer Feature Correlation for Small Object Detection 论文链接:https://ieeexplore.ieee.org/abstract/document/10671587 giuhub:https://github.com/nuliweixiao/EFC 关键词…

vue2+element-ui实现多行行内表格编辑

效果图展示 当在表格中点击编辑按钮时:点击的行变成文本框且数据回显可以点击确定按钮修改数据或者取消修改回退数据: 具体实现步骤 1. 行数据定义编辑标记 行数据定义编辑标记 当在组件中获取到用于表格展示数据的方法中,针对每一行数据添加一个编辑标记 this.list.f…

docker简单私有仓库的创建

1:下载Registry镜像 导入镜像到本地中 [rootlocalhost ~]# docker load -i registry.tag.gz 进行检查 2:开启Registry registry开启的端口号为5000 [rootlocalhost ~]# docker run -d -p 5000:5000 --restartalways registry [rootlocalhost ~]# dock…

使用 GD32F470ZGT6,手写 I2C 的实现

我的代码:https://gitee.com/a1422749310/gd32_-official_-code I2C 具体代码位置:https://gitee.com/a1422749310/gd32_-official_-code/blob/master/Hardware/i2c/i2c.c 黑马 - I2C原理 官方 - IIC 协议介绍 个人学习过程中的理解,有错误&…

VSCode,Anaconda,JupyterNotebook

文章目录 一. 下载VSCode并安装二. 下载Anaconda并安装1. anaconda介绍2. Anaconda的包管理功能3. Anaconda的虚拟环境管理4.Jupyter Notebook5. Jupyter Notebook使用简介6. Jupyter Notebook快捷键7.Jupyter notebook的功能扩展8. Jupyter notebook和Jupyter lab的区别 三. V…

【安全研究】某黑产网站后台滲透与逆向分析

文章目录 x01. 前言x02. 分析 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与…

力扣 343. 整数拆分 (JAVA 记忆化搜索->动态规划)

给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k > 2 ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: n 10 输出: 36 解释: 10 3 …

一次tomcat实战jvm线上问题定位排查和解决

问题分析: 问题来源是客户通过闲鱼找到了我这边进行问题的排查,给我发了一个报错日志,让我帮忙分析。 首先他的项目比较老,很多年以前开发的软件,但是具体做什么业务我不知道。下面来看日志的报错分析。 问题&#…

【Linux】软硬链接

文章目录 软链接硬链接软硬链接的使用场景:软链接的使用场景硬链接的应用场景 总结 软链接 软链接是一种指向文件或目录的快捷方式,是文件系统中非常重要的功能。它类似于Windows中的快捷方式,但更灵活,可以跨文件系统创建。 ln…

操作系统(5)进程

一、定义与特点 定义:进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 特点: 动态性:进程是动态创建的,有它自身的生命周期,…

安宝特分享 | AR技术助力医院总院与分院间的远程面诊

随着科技的迅猛发展,增强现实(AR)技术在各行各业的应用愈发广泛,特别是在医疗领域,其潜力和价值正在被不断挖掘。在现代医疗环境中,患者常常面临“看病难、看病远、看病急”等诸多挑战,而安宝特…

CNCF云原生生态版图-分类指南(三)- 运行时

CNCF云原生生态版图-分类指南(三)- 运行时 CNCF云原生生态版图-分类指南三、运行时(Runtime)(一)云原生存储(Cloud Native Storage)1. 是什么?2. 解决什么问题&#xff1…

通俗易懂的 Nginx 反向代理 配置

通俗易懂的 Nginx 反向代理 配置 首先 root 与 alias 的区别 root 是直接拼接 root location location /i/ {root /data/w3; }当请求 /i/top.gif ,/data/w3/i/top.gif 会被返回。 alias 是用 alias 替换 location location /i/ {alias /data/w3/images/; }当请…

HiveQL命令(一)- 数据库操作

文章目录 前言一、数据库操作1. 创建数据库1.1 语法及解释1.2 创建数据库示例 2. 查看数据库2.1 查看所有数据库2.2 查看数据库信息2.2.1 语法及解释2.2.2 查看数据库信息示例 3. 切换数据库3.1 语法3.2 示例 4. 修改数据库4.1 语法4.2 示例 5. 删除数据库5.1 语法及解释5.2 示…

Ubuntu22.04安装docker desktop遇到的bug

1. 确认已启用 KVM 虚拟化 如果加载了模块,输出应该如下图。说明 Intel CPU 的 KVM 模块已开启。 否则在VMware开启宿主机虚拟化功能: 2. 下一步操作: Ubuntu | Docker Docs 3. 启动Docker桌面后发现账户登陆不上去: Sign in | …

FPGA实现GTP光口数据回环传输,基于Aurora 8b/10b编解码架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目我这里已有的 GT 高速接口解决方案 3、工程详细设计方案工程设计原理框图用户数据发送模块基于GTP高速接口的数据回环传输架构GTP IP 简介GTP 基本结构GTP 发送和接收…

(二)多智能体强化学习

目录 前言 一、多智能体强化学习的概念 二、多智能体面临的问题 三、现有算法简介 总结 前言 基于上一篇文章对于强化学习基础概念的介绍,本篇文章针对多智能体强化学习进行介绍和总结,帮助大家了解多智能体的基本概念以及算法,方便大家…

【Linux网络编程】传输协议UDP

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站 🌈个人主页: 南桥几晴秋 🌈C专栏: 南桥谈C 🌈C语言专栏: C语言学习系…

汽车车牌识别数据集,支持YOLO,COCO,VOC格式的标注,8493张图片,可识别多种环境下的车牌

汽车车牌识别数据集,支持YOLO,COCO,VOC格式的标注,8493张图片,可识别多种环境下的车牌 数据集分割 训练组82% 6994图片 有效集12% 999图片 测试集6% 500图片 预处理 自动…

流网络复习笔记

所以这里的19是118-019 <s , w> 1/3就是容量是3&#xff0c;流量是1 残留网络就是两个相对箭头上都是剩余对应方向还能同行的流量 所以s->w 3-1 2, w->s 1