一条 SQL 语句在 MySQL 中的执行过程

当一条 SQL 语句被提交到 MySQL 时,它会经历多个步骤,包括解析、优化、执行等。以下以 SELECT 语句为例,详细描述整个执行流程。


1. 客户端与服务器连接

  • 客户端通过 TCP/IP、Unix socket 等协议与 MySQL 服务器建立连接。
  • MySQL 服务器验证客户端身份(用户名、密码)并检查权限。
  • 为每个连接分配线程,后续的 SQL 请求由该线程处理。

2. 查询接收与初步处理

  • MySQL 接收到来自客户端的 SQL 语句后,将其送入 SQL 层。
  • 此时,SQL 语句只是一个字符串,需要进行进一步处理。

3. 查询解析

语法解析

MySQL 使用解析器对 SQL 语句进行语法检查,验证语句格式是否正确。

如果有语法错误,立即返回错误信息。

语义解析

检查:

  • 表、列等数据库对象是否存在。
  • 用户是否拥有相关权限。

解析完成后,MySQL 会生成一棵 解析树


4. 查询优化

MySQL 的优化器负责根据解析树生成最优的执行计划。优化过程包括以下步骤:

(1)表的访问顺序

  • 对于多表查询,决定表的连接顺序。
  • 优化器基于表的大小、关联条件等生成访问顺序。

(2)索引选择

  • 判断是否有合适的索引可以利用。
  • 选择索引时考虑索引类型(主键索引、二级索引)、选择性等。

(3)查询重写

  • 将子查询优化为 JOIN 或其他高效的操作。
  • 进行谓词下推(将过滤条件尽量推到存储引擎层)。

(4)成本估算

  • 基于统计信息(如表的行数、索引选择性等)计算每种方案的成本。
  • 选择最低成本的执行计划。

优化完成后,MySQL 会生成一个 执行计划


5. 查询执行

(1)存储引擎层执行

  • 根据执行计划,存储引擎负责实际的数据读取操作。
  • 如果有索引:存储引擎通过索引快速定位数据。
  • 如果无索引:存储引擎执行全表扫描。

(2)SQL 层操作

SQL 层基于存储引擎返回的数据进行进一步处理:

  • 执行过滤操作(如 WHERE 条件)。
  • 处理排序(ORDER BY)、分组(GROUP BY)或聚合函数。
  • 如果有分页(LIMIT),提取符合条件的记录。

(3)使用临时表

当查询涉及复杂操作(如排序、分组等)时,MySQL 可能会创建临时表存储中间结果:

  • 小型临时表存放于内存中。
  • 大型临时表会写入磁盘。

6. 返回结果

MySQL 将最终处理结果返回给客户端:

  • 如果是查询操作(SELECT),返回数据行。
  • 如果是修改操作(INSERT/UPDATE/DELETE),返回受影响的行数。

7. 示例:SQL 执行流程

假设执行以下 SQL:

SELECT name, age FROM users WHERE age > 30 ORDER BY age DESC LIMIT 5;

具体流程:

1. 解析:

  • 检查users表和name、age列是否存在。
  • 验证语法,生成解析树。

2. 优化:

  • 选择合适的索引(如age列上的索引)。
  • 确定过滤条件、排序和分页的执行顺序。

3. 执行:

  • 存储引擎扫描满足age> 30 的记录。
  • SQL 层对记录按age降序排序,并提取前 5 条。

4.返回:

  • 将查询结果返回给客户端。

总结

一条 SQL 语句的执行过程可以总结为以下几个步骤:

1.连接建立:客户端与服务器建立通信。

2.解析语句:检查语法和语义,生成解析树。

3.优化查询:生成最低成本的执行计划。

4.执行计划:存储引擎读取数据,SQL 层处理结果。

5.返回结果:将最终结果发送回客户端。

整个流程体现了 MySQL 从解析到执行的高效协作。

一条 SQL 语句在 MySQL 中的执行过程的更多相关文章

  1. 一条 SQL 语句在 MySQL 中如何执行的

    一 MySQL 基础架构分析 1.1 MySQL 基本架构概览 下图是 MySQL 的一个简要架构图,从下图你可以很清晰的看到用户的 SQL 语句在 MySQL 内部是如何执行的. 先简单介绍一下下图 ...

  2. 一条SQL语句在MySQL中如何执行

    一条SQL语句在MySQL中如何执行 本篇文章会分析一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的. 在分析之前我会 ...

  3. 一条SQL语句在MySQL中如何执行的

    本篇文章会分析一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的. 在分析之前我会先带着你看看 MySQL 的基础架构, ...

  4. 一条SQL语句在MySQL中是如何执行的

    概览 本篇文章会分析下一个sql语句在mysql中的执行流程,包括sql的查询在mysql内部会怎么流转,sql语句的更新是怎么完成的. 一.mysql架构分析 mysql主要分为Server层和存储 ...

  5. sql语句在Mysql中如何执行?

    1.MySQL 主要分为 Server 层和引擎层,Server 层主要包括连接器.查询缓存.分析器.优化器.执行器,同时还有一个日志模块(binlog),这个日志模块所有执行引擎都可以共用,redo ...

  6. 一条查询语句在MySQL中是如何执行的?

    前言 我们在学习一种技术的时候,首先要鸟瞰其全貌,千万不要一开始就陷入到细节中去,这样有助于我们站在高维度其理解问题 —— 丁奇. 学习MySQL也是一样,所以我们可以从一条查询语句的执行开始看起. ...

  7. 原来一条select语句在MySQL是这样执行的《死磕MySQL系列 一》

    前言 看到蒋老师的第一篇文章后就收货颇丰,真是句句戳中痛点. 令我记忆最深的就是为什么知道了一个个技术点,却还是用不好 ?不管是蒋老师所说的Redis还是本系列要展开学习的MySQL. 这是一个值得思 ...

  8. 使用PowerDesigner创建物理模型并生成SQL语句在MySQL中生成表

    我使用的PowerDesigner的版本为16.5,创建物理模型后,使用PowerDesigner生成的SQL语句,在MySQL中创建表. 1. 打开Power Designer软件,在弹出的欢迎对话 ...

  9. sql语句(mysql中json_contains、json_array的使用)

    https://blog.csdn.net/qq_35952946/article/details/79131488 https://www.jianshu.com/p/455d3d4922e1 1. ...

  10. SQL语句在数据库中可以执行在mybatis执行不了

    这个问题竟然纠结了半个小时! 就问题而言,肯定是出在mybatis中 终于,找到了答案, 原来是DataSource配置问题, 我将配置连接池的数据写到了文件db.properties中, SqlMa ...

随机推荐

  1. Python代码将大量遥感数据的值缩放指定倍数的方法

      本文介绍基于Python中的gdal模块,批量读取大量多波段遥感影像文件,分别对各波段数据加以数值处理,并将所得处理后数据保存为新的遥感影像文件的方法.   首先,看一下本文的具体需求.我们现有一 ...

  2. mysql8.0无备份通过idb文件恢复数据过程、idb文件修复和tablespace id不一致处理

    周末突然接到一位一年多没联系的妹妹打来电话,"刘哥,快来救救我",我脑海瞬间冒出妙瓦底,电信火苲马扁.....,当时就冒汗了,心想这个妹子怎么被... 问其原由,原来是他们公司服务 ...

  3. C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  4. 独立开发经验谈:如何借助 AI 辅助产品 UI 设计

    我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统.陆陆续续开发了几年,从一开始的偶有用户尝试,到如今线上环境和私有化部署均有了越来越多的稳定用户,在这个过程中,我也积累了不少如何开发运营 ...

  5. 一键部署Palworld幻兽帕鲁服务器最佳实践

    本文基于天翼云通用型云主机,为您介绍通过镜像一键部署Palworld幻兽帕鲁服务器的具体操作. Ubuntu系统 1.按需购买云主机.通过Palworld专属活动优惠页一键购买开通云主机. 根据需要选 ...

  6. Java中int、Integer、long、Long、double、Double和BigInteger的关系

    Java中int.Integer.long.Long.double.Double和BigInteger的关系 在Java中,int.Integer.long.Long.double.Double和Bi ...

  7. 用 just 简化项目命令管理

    在软件开发过程中,高效管理项目命令是提升开发效率的关键, 它们可以帮助我们自动化重复的任务,简化项目管理流程,提高效率. 今天,我们来介绍一个名为 just 的任务运行器. 它由 Casey 发起,用 ...

  8. [QOJ8672][PKUSC2024] 排队

    函数复合,直接转化为离线问题,那我们就需要完成对满足条件的量的区间加操作. 显然 \(ans_{[l,r]}\ge ans_{(l,r]}\),所以可以线段树二分. 时间复杂度 \(O(q\log n ...

  9. LINUX 服务器安装nginx redis jdk等步聚

    1.安装指令步聚 sudo yum update 更新linux系统 yum install -y nginx 安装nginx systemctl enable nginx 设置开机启动nginx s ...

  10. linux下安装 elasticsearch

    一.基础环境 操作系统环境:Red Hat Enterprise Linux Server release 6.4 (Santiago) ES版本:elasticsearch-7.8.0-linux- ...