文章目录
- 一、执行流程
- 二、建立连接
- 三、预处理器
- 四、解析器
- 4.1 词法分析
- 4.2 语法分析
- 4.3 语义分析
- 五、优化器
- 六、执行器
- 七、返回结果
一、执行流程
阶段 | 主要功能 | 关键组件 |
---|---|---|
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 |
+----+--------+