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    |
+----+--------+
相关推荐
v***56521 分钟前
使用bitnamiredis-sentinel部署Redis 哨兵模式
数据库·redis·sentinel
2501_9411118235 分钟前
使用Python进行网络设备自动配置
jvm·数据库·python
m***11901 小时前
MySQL官网驱动下载(jar包驱动和ODBC驱动)【详细教程】
数据库·mysql
煎蛋学姐2 小时前
SSM基于J2EE的山西旅游网站的设计与实现iiqmx(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
java·数据库·java-ee·ssm 框架·山西旅游网站·在线预订系统
咸甜适中2 小时前
rust语言,将JSON中的所有值以字符串形式存储到sqlite数据库中(逐行注释)
数据库·rust·sqlite·json
树下水月3 小时前
python 连接hive2 数据库
开发语言·数据库·python
DARLING Zero two♡3 小时前
用Rust构建一个OCR命令行工具
数据库·rust·ocr
chxii3 小时前
MyBatis 动态 SQL,通过 XML (如 <if>、<foreach> 等)实现灵活的 SQL 拼接。
xml·sql·mybatis
蟹至之4 小时前
增删查改基础(其三)—— 聚合函数、分组查询(group by与having)、内置函数
数据库·mysql·增删查改
2501_941111244 小时前
Django全栈开发入门:构建一个博客系统
jvm·数据库·python