一条 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. ESP32 idf常用脚本命令及git命令

    一.Linux环境 1.下载并安装相关的工具 ./install.sh 2.添加ESP-IDF工具到PATH中 . ./export.sh 3.打开配置界面 idf.py menuconfig 4.设 ...

  2. mysql异常处理的收集

    今天在处理mysql的存储过程,判断游标是否到了结尾,结果让返回零行的一个查询触发了,随即从网上查阅资料收集异常异常处理. MySql错误处理(一)- SQL服务器模式 导言:MySql错误处理的基础 ...

  3. Transaction rolled back because it has been marked as rollback-only问题解决

    1.背景 在我们的日常开发中,经常会存在在一个Service层中调用另外一个Service层的方法.比如:我们有一个TaskService,里面有一个execTask方法,且这个方法存在事务,这个方法 ...

  4. 让AI碰撞!“天翼云息壤杯”高校AI大赛江苏赛区交流会热力开场!

    由中国电信集团有限公司主办,天翼云科技有限公司承办的"天翼云息壤杯"高校AI大赛正在火热进行中.为了提高江苏赛区学生的参赛热情,增强学生的创作能力,江苏电信.天翼云华东中心于12月 ...

  5. Typecho获取当前页面加载完成速度时间

    判断当前页面加载是否快速,通常是直接在浏览器中访问网站,看自己的直观感受是否快速.而客观的方法则是计算具体的页面加载时间并显示出来给看. 1.在当前主题的functions.php文件添加下面的代码: ...

  6. Go实现动态开点线段树

    1.线段树介绍 线段树是一种用于高效处理区间查询和区间更新的数据结构,当我们需要解决一个频繁更新区间值的问题的时候,就可以采用线段树的结构进行解决.线段树的核心思想是将区间分为多个子区间进行管理,越往 ...

  7. 普通文本(.txt)篇章排版样式参考 [文档说明][日志]

    把普通文本的篇章排版样式归总一下,供自己参考,当然如果读者能以此借鉴并学习到一些东西,是笔者最大的鼓励. 日志类 [1] 头标 [时间日期][备注][属性]内容 [2] [文件信息][符号][文件信息 ...

  8. Hi3516EV200 编译环境配置及交叉编译软件包

    基础信息 OS: Ubuntu 16.04 xenial SDK 版本: Hi3516EV200R001C01SPC012 - Hi3516EV200_SDK_V1.0.1.1 SDK 包路径:Hi3 ...

  9. 深入理解C++ 空类大小

    在C++中,规定空类(即类中没有任何数据成员.成员函数.虚函数等成员的类)的大小为1字节,这背后主要有以下几方面的原因: 保证对象的唯一性和可区分性 在C++的面向对象编程模型中,对象是类的实例化结果 ...

  10. SpringCloud带你走进微服务的世界

    认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构.这些架构之间有怎样的差别呢? 单体架构 单体架构:将业务的所有功能集中在一个项目中开发,打 ...