查看: 51|回覆: 0

[MSSQL] SQL语句的执行流程语法分析

[複製鏈接]

2

主題

0

回帖

0

積分

热心网友

金币
0
閲讀權限
220
精華
0
威望
0
贡献
0
在線時間
0 小時
註冊時間
2012-4-28
發表於 2025-5-26 10:02:30 | 顯示全部樓層 |閲讀模式

一、执行流程

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

二、建立连接

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

# 建立MySQL连接
mysql -h localhost -u username -p database_name

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

三、预处理器

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

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

四、解析器

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

4.1 词法分析

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

SELECT name, age FROM users WHERE age > 18;

词法分析结果:

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

4.2 语法分析

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

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

4.3 语义分析

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

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

五、优化器

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

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

示例SQL:

SELECT name FROM student WHERE age > 18;

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

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

六、执行器

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

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

七、返回结果

查询执行完成后,将结果返回给客户端。
比如下面的 SQL:

SELECT id, name FROM user LIMIT 2;

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

+----+--------+
| id | name   |
+----+--------+
| 1  | Alice  |
| 2  | Bob    |
+----+--------+
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 立即注册

本版積分規則

相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部