今天来说说一条 SQL 语句的执行过程

本文详细描述了MySQL查询的执行流程,包括连接器的权限验证、查询缓存的工作原理、语法和词法分析、优化器的选择决策,以及执行器的实际数据查询操作。
摘要由CSDN通过智能技术生成

我们以一条查询 SQL 为例:select * from user where id=1;

在这条查询语句中,大体可以分为两个层面,Server 层和存储引擎层,顾名思义,在 Server 层中涉及到一系列的业务的组件下面会讲述各个组件的功能,而存储引擎层则是负责存储发送过来的数据、提供读写接口等功能(补充:MySQL 的存储引擎是插件式的,一个数据库里面的不同表可以用不同的存储引擎)。
在这里插入图片描述

具体流程如下:

1)当客户端的 SQL 发送到 MySQL 时,首先是到达 Server 层的连接器,连接器会对你此次发起的连接进行权限校验,以此来获取你这个账号拥有的权限。当你的账号或密码不正确时,会报 Access denied for user 错误,相信大家对这个错误也并不陌生。连接成功如果后续没有任何操作,那么这个连接就处于空闲状态,到达一定时间后它便会断开连接,这个时间一般是 8 小时,是由 wait_timeout 参数控制的。

2)查询缓存(在 MySQL 8.0 之后就被砍了)具体做法就是将一个查询语句作为 key ,将上一次请求的结果作为 value,存储在缓存组件中,当同样的语句来查询的时候即可立马返回结果,不需要经历词法、语法分析等以下的步骤。只要表有数据改动缓存就失效了,在我们常见的 联机事务处理(OLTP) 场景下是个鸡肋。

3)接下来就到了分析器来进行语法分析词法分析。MySQL 会首先对你的语句进行 ”词法分析“ ,来判断你的语句是什么类型以及携带什么参数等。比如:MySQL 会将输入语句的 select 提取出来,判断出这是一条查询语句、将 from 后面的 user 提取出来作为查询的表名、把 id 提取出来作为列名等。做完这些 MySQL 将会进行 ”词法分析“ 来判断你的语句的语法是否有误、是否满足 MySQL 的语法。如果语法有问题,那这个错误相信大家都不陌生:You have an error in your SQL syntax; check the manual......

4)经过分析器就到了优化器,它会对你的语句进行优化判断。比如你的表中有多个索引,优化器会帮你选择使用哪个索引、你使用了 join 多表连接,优化器会帮你调整表的连接顺序。我们平日里用的 explain 其实就是让 MySQL 告诉我们它的优化决定策略是怎样的。

5)最后会到达执行器,它先会判断你对这个 user 表是否有权限查询,如果没有权限它将会拒绝本次查询,返回错误信息。如果有权限,它将会根据表的存储引擎提供的接口进行数据查询将重复遍历表的行数据,判断 id 字段是否等于 1。直到遍历完整个表将符合条件的数据作为结果集返回给客户端。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值