在Mysql中一条查询SQL的执行过程是怎样的

    在Mysql中执行过程总共分为五步。

第一步:查询缓存

    查询缓存这一步在mysql是默认关闭的,而且在mysql8.0之后就正式移除。
    移除的原因主要有两点。首先,mysql缓存的格式为key-valuekey为sql语句,value为查询到的结果。这样的缓存格式就导致sql的命中条件很苛刻。假如sql多了一个空格都会导致无法命中缓存。
    第二点就是由于表中的数据是动态变化的,数据一变缓存就要跟着更新,这样就导致缓存的更新成本过高。
    所以查询缓存这步多多少少都有点副作用,移除它只是合情合理。

第二步:解析字段

    根据空格,将sql拆分成一个个最小的单元。比如说sql:select name,wechat from fans where sex = '女' and yanzhi > 90,并参照数据库的语法字典将这些单元分类。此时若出现关键字的拼写错误,则会出现报错提升;如果拼写没有错误,则会将分类后的单元转换成一种树形结构。
在这里插入图片描述
    绿色代表关键字,红色代表变量名以及表名,灰色则表示需要进一步拆分。

第三步:预处理

    对树型结构中的表名、字段名进行校验,如果表名或字段名不存在,则会在这一步返回报错信息。

第四步:优化

    这里的优化是指对查询效率的优化。优化器会根据上一步的树形结构生成多种sql的排列组合,然后结合一些算法来选择查询效率最快的一种执行方案。比如是否有索引、字段多个索引字段如何搭、多表关联时以那个表位基准表等等。这个执行方案会生成一个执行计划,这个我们口语在select前面加explain来查看。但是这一步计算出的执行计划不一定是最优的,因为算法本身就存在一定的概率性,他只能保证大概率是最优的。

最后一步:执行

    执行器首先会做权限判断,如果操作的角色没有对表的查询权限,则会在这一步返回权限错误。
    权限无误后执行器会拿上一步的执行计划来调用存储引擎。由存储引擎对数据进行实际的查询操作,并返回最终的查询结果。
    
    
    前四步也相当于预处理,也就是业务逻辑判断,而最终对物理数据进行操作的也就是存储引擎了。mysql是以组件的形式引入存储引擎的。然后将查询到的数据返回给终端。

### SQL 查询语句在 MySQL 中的执行过程 #### 连接建立 当客户端向 MySQL 发送 SQL 语句之前,已经与 MySQL 建立了一个稳定连接[^2]。 #### 查询缓存检查 一旦收到查询请求,MySQL 首先尝试查找查询缓存。如果存在相同的查询记录及其结果集,则直接返回这些已缓存的数据给客户端而无需继续后续处理步骤。然而,随着版本的发展,出于性能考虑,某些情况下即使配置了查询缓存也可能被忽略不计[^3]。 #### 正式的查询阶段 对于未命中的查询缓存情况: - **词法分析** 客户端提交的是由字符组成的字符串形式的 SQL 请求。为了理解这条命令的确切含义,MySQL 必须对其进行初步拆解——即所谓的“词法分析”。此过程中会识别出关键字、标识符以及常量等基本单元,并将其转换为内部结构表示。 - **语法分析** 接下来是更为严格的验证环节,“语法分析”负责确认所接收的 SQL 表达式遵循正确的语法规则。它基于先前得到的信息构建抽象语法树(AST),并在此基础上进一步评估其合法性。 - **预处理** 经过前面两步之后形成的 AST 将传递至预处理器进行更深层次的安全性和逻辑性审查。此时不仅限于简单的格式校验,还包括但不限于: - 检查表名及字段名称的有效性; - 确认当前用户具备足够的权限来访问指定对象; 如果发现任何异常都将立即终止整个流程并向外部报告错误信息[^5]。 #### 访问存储引擎层 假设一切顺利的话,接下来便是调用具体数据库引擎所提供的 API 来获取实际所需数据。不同类型的存储引擎可能有着各自独特的实现方式,但总体而言都是围绕着读取索引节点、扫描范围定位目标行等内容展开工作[^4]。 #### 结果集组装与反馈 最后一步则是将从底层检索到的数据按照原始查询的要求整理成最终的形式传回前端展示给使用者查看。期间还涉及到诸如排序、分组聚合等功能模块的应用以满足多样化的业务需求[^1]。 ```sql -- 示例:一个典型的SELECT查询语句 SELECT name, age FROM users WHERE id = 1; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值