SQL语句的执行流程

文章目录


一、执行流程

阶段 主要功能 关键组件
1. 建立连接 身份验证、权限检查 连接器
2. 预处理器 缓存检查、SQL预处理 查询缓存
3. 解析器 词法分析、语法分析、语义检查 解析器
4. 优化器 生成最优执行计划 查询优化器
5. 执行器 按计划执行查询 执行引擎
6. 返回数据 结果返回、资源清理 结果处理器

二、建立连接

当应用程序需要执行SQL语句时,首先需要与数据库服务器建立连接:

sql 复制代码
# 建立MySQL连接
mysql -h localhost -u username -p database_name

连接阶段的主要工作:身份验证和分配连接资源。


三、预处理器

预处理器主要负责SQL语句的预处理工作:

  • 在MySQL 8.0之前的版本中,预处理器首先检查查询缓存。
  • 读取到这条SQL语句的基本信息。
  • 去除注释和多余空格,大小写标准化。

四、解析器

分析器负责对SQL语句进行全面的分析和检查:

4.1 词法分析

将SQL语句分解为一系列的标记:

sql 复制代码
SELECT name, age FROM users WHERE age > 18;

词法分析结果:

标记 类型 说明
SELECT 关键字 SQL关键字
name 标识符 字段名
, 分隔符 逗号分隔符
age 标识符 字段名
FROM 关键字 SQL关键字
users 标识符 表名
WHERE 关键字 SQL关键字
> 操作符 比较操作符
18 数值常量 整数字面量

4.2 语法分析

根据SQL语法规则构建抽象语法树(AST):

sql 复制代码
          SELECT
          /      \
     字段列表      FROM子句
     /    \          |
   name   age     users表
                     |
                 WHERE子句
                     |
                  条件表达式
                 /    |    \
               age    >     18

4.3 语义分析

进行语义层面的检查和验证:

  1. 表存在性检查:查询表信息是回去数据库查询是否有这个表。
  2. 字段存在性检查:查询字段信息是回去数据库表查询是否有这个字段。
  3. 权限检查:设计表或数据库的删除要检查当前用户的权限。
  4. 约束检查:查询表的主外键、不为空、唯一等约束条件。

五、优化器

选择代价最小的执行计划,从而提高 SQL 执行效率,场见的优化场景如下:

  • 确定多表连接顺序
  • 是否使用索引?使用哪个索引?
  • 选择合适的执行算法(嵌套循环 / 哈希连接 / 排序 / 归并等)

示例SQL:

sql 复制代码
SELECT name FROM student WHERE age > 18;

执行器的执行过程可能如下:

  1. 使用 B+ 树索引快速定位满足 age > 18 的主键 ID;
  2. 根据主键回表获取 name 字段;
  3. 逐行拼装结果集并返回给客户端。

六、执行器

根据执行计划,具体执行 SQL。
步骤:

  1. 访问表、索引,执行 WHERE 条件过滤
  2. 做连接操作、聚合、排序等
  3. 将结果写入结果集返回客户端

七、返回结果

查询执行完成后,将结果返回给客户端。

比如下面的 SQL:

sql 复制代码
SELECT id, name FROM user LIMIT 2;

结果集在返回客户端前,格式如下:

sql 复制代码
+----+--------+
| id | name   |
+----+--------+
| 1  | Alice  |
| 2  | Bob    |
+----+--------+
相关推荐
lang201509285 分钟前
MySQL缓冲池秒热技巧:告别冷启动
数据库·mysql
weixin_307779136 分钟前
Redshift SQL搜索表中所有字段的值
数据仓库·sql·算法·云计算·aws
我科绝伦(Huanhuan Zhou)1 小时前
PostgreSQL 18 新特性解析(附一键安装脚本)
数据库·postgresql
hong_zc3 小时前
redis之缓存
数据库·redis·缓存
诺青2354 小时前
MongoDB副本集
数据库·mongodb
正在走向自律4 小时前
金仓数据库打通电子证照国产化“最后一公里”——福建某地2TB MongoDB无缝迁移实践
数据库·mongodb·国产数据库·电科金仓
阿波罗尼亚5 小时前
复杂查询:直接查询/子查询/视图/CTE
java·前端·数据库
Go高并发架构_王工5 小时前
MySQL内存优化:缓冲池与查询缓存调优技术详解
数据库·mysql·缓存
武昌库里写JAVA5 小时前
SpringCloud与微服务
vue.js·spring boot·sql·layui·课程设计
disanleya5 小时前
mysql怎么安装,新手安装MySQL后如何安全备份不踩坑?
数据库·mysql