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

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.lryc.cn/news/2385699.html

相关文章:

  • Spring 框架的JDBC 模板技术
  • 【游戏设计】游戏玩法与游戏机制
  • Spring的资源Resource和ResourceLoader
  • 字节跳动旗下火山引擎都覆盖哪些领域
  • 【AI实战】从“苦AI”到“爽AI”:Magentic-UI 把“人类-多智能体协作”玩明白了!
  • LeetCode面试经典150题梳理
  • ABP VNext + Orleans:Actor 模型下的分布式状态管理最佳实践
  • Linux之 SPI 驱动框架- spi-mem 框架
  • 振动分析 - 献个宝
  • 从脑电图和大脑记录中学习稳健的深度视觉表征
  • 【论文阅读】——D^3-Human: Dynamic Disentangled Digital Human from Monocular Vi
  • 高分辨率北半球多年冻土数据集(2000-2016)
  • Prompt Tuning:轻量级大模型微调全攻略
  • 【VBA 字典的引用和调用方法】
  • 基于开源AI智能名片链动2+1模式S2B2C商城小程序的管理与运营策略研究
  • 储能电站:风光储一体化能源中心数字孪生
  • iOS 直播特殊礼物特效实现方案(Swift实现,超详细!)
  • 9. 现代循环神经网络
  • 视频太大?用魔影工厂压缩并转MP4,画质不打折!
  • Python中tqdm进度条工具和enumerate函数的使用详解
  • 最宽温度范围文本格式PT1000分度表-200~850度及PT1000铂电阻温度传感器计算公式
  • 基于Netty架构的充电桩系统设计:服务器运维如何更好保障稳定性?
  • 操作系统学习笔记第1章 操作系统概述(灰灰题库
  • 后端开发实习生-抖音生活服务
  • 机器学习算法-sklearn源起
  • Keepalived 在不同场景下的高可用方案设计与最佳实践
  • 注册并创建一个微信小程序
  • CentOS 10:启动telnet服务
  • 计算机网络——每一层的用到的设备及其作用
  • OpenLayers 加载鹰眼控件