当前位置: 首页 > news >正文

SQL语句的执行流程

文章目录

  • 一、执行流程
  • 二、建立连接
  • 三、预处理器
  • 四、解析器
    • 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 语义分析

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

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

五、优化器

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

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

示例SQL:

SELECT name FROM student WHERE age > 18;

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

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

六、执行器

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

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

七、返回结果

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

SELECT id, name FROM user LIMIT 2;

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

+----+--------+
| id | name   |
+----+--------+
| 1  | Alice  |
| 2  | Bob    |
+----+--------+
http://www.xdnf.cn/news/621145.html

相关文章:

  • C++搜索二叉树
  • Java语言快速排序和堆排序(优先队列)介绍,附demo代码
  • C# 深入理解类(析构函数和this关键字)
  • 【RK3588新品】嵌入式人工智能实验箱EDU-AIoT ELF 2发布
  • 【萤火工场GD32VW553-IOT开发板】ADC电压的LabVIEW采集
  • 【漫话机器学习系列】275.GrabCut 算法——用于去除图片背景(Grabcut For Removing Image Backgrounds)
  • SpringBoot项目配置文件、yml配置文件
  • 大厂缓存架构方案-Caffeine+Redis双层缓存架构
  • 织梦dedecms登录后台出现Safe Alert Request Error step 2
  • 企业级单元测试流程
  • BLIP3-o:一系列完全开源的统一多模态模型——架构、训练与数据集
  • 深入理解 JVM 运行时数据区
  • 让MySQL更快:EXPLAIN语句详尽解析
  • 如何设计Agent的记忆系统
  • Cmake编译gflags过程记录和在QT中测试
  • std::thread的说明与示例
  • Linux中的文件描述符
  • 毕业论文格式(Word)
  • LINUX 524 rsync+inotify 调试(问题1:指定端口无法同步/已通过;问题2:rsync.log文件中时间不显示/已显示)
  • Linux--环境的搭建(云服务器)
  • 云原生安全:Linux命令行操作全解析
  • 自媒体运营新利器:账号矩阵+指纹浏览器,解锁流量密码
  • STM32中断优先级分组有哪几种?
  • 分享一套提高表达力的图书
  • 关于 Web 安全:4. 中间件 框架风险点分析
  • 【爬虫】爬bibi视频
  • LINQ性能优化终极指南
  • C++八股 —— 手撕shared_ptr
  • 我爱学算法之—— 二分查找(下)
  • 【案例篇】 实现简单SSM工程-后端