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    |
+----+--------+
相关推荐
倔强的石头_15 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript
加号35 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏5 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐5 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再5 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
tryCbest5 天前
数据库SQL学习
数据库·sql