SQL语句的执行流程语法分析
一、执行流程
| 阶段 | 主要功能 | 关键组件 |
|---|---|---|
| 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 > 184.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 | +----+--------+
到此这篇关于SQL语句的执行流程的文章就介绍到这了,更多相关SQL语句的执行流程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
sql中的left join及on、where条件关键字的区别详解
LEFT JOIN 关键字从左表(table1)返回所有的行,即使右表(table2)中没有匹配。如果右表中没有匹配,则结果为 NULL。这篇文章主要介绍了sql中的left join以及on、where关键字的区别,需要的朋友可以参考下2018-08-08
MSSQL报错:参数数据类型 text 对于 replace 函数的参数 1 无效的解决办法
在sql中使用replace函数可以替换某个字段中的一些内容,但是如果字段是text类型那么使用replace函数就会报“参数数据类型text 对于replace 函数的参数1 无效。”,这个错误说明对text或ntext类型的数据在查询中不能进行字符串操作2014-03-03
sqlserver中在指定数据库的所有表的所有列中搜索给定的值
最近因ERP项目,我们需要知道前台数据导入功能Application操作的导入字段都写入到了后台数据库哪些表的哪些列2011-09-09


最新评论