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    |
+----+--------+
相关推荐
He.ZaoCha26 分钟前
函数-1-字符串函数
数据库·sql·mysql
二当家的素材网34 分钟前
Centos和麒麟系统如何每天晚上2点10分定时备份达梦数据库
linux·数据库·centos
白仑色41 分钟前
Oracle 存储过程、函数与触发器
数据库·oracle·数据库开发·存储过程·plsql编程
头发那是一根不剩了2 小时前
Spring Boot 多数据源切换:AbstractRoutingDataSource
数据库·spring boot·后端
草履虫建模2 小时前
Redis:高性能内存数据库与缓存利器
java·数据库·spring boot·redis·分布式·mysql·缓存
泊浮目3 小时前
未来数据库硬件-计算篇
数据库·云计算·操作系统
靖顺3 小时前
【OceanBase诊断调优】—— 执行计划显示分区 PARTITIONS[P0SP9] 如何查询是哪个分区?
数据库·oracle·oceanbase
KIDAKN4 小时前
MySQL 存储结构
数据库·mysql
Code季风4 小时前
SQL关键字快速入门:HAVING 分组后的条件过滤
数据库·sql·mysql
程序猿ZhangSir4 小时前
Redis 缓存进阶篇,缓存真实数据和缓存文件指针最佳实现?如何选择?
数据库·redis·缓存