mysql查询语句执行过程

本文详细解释了MySQL中SQL语句的执行过程,包括连接器的身份验证、分析器的语法检查、处理器-prepare阶段的转化、优化器的执行方案确定和执行器的实际执行。还特别提到了MySQL8.0新增的预处理器阶段。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


我们经常编写sql语句,例如:

	select id from table where id = 1;

那么思考一下,这一条sql语句在mysql中他是怎么的一个流程呢,内部是怎样执行的呢?

我们可以将Mysql执行的过程分为四个部分。(mysql8.0之后新增预处理器-prepare阶段)

1、连接器

建立客户端与MySQL服务器之间的连接,并进行身份验证和权限检查。

在我们执行sql的第一步,就是连接我们的mysql服务器,这个阶段会进行一些登陆以及权限校验操作。

2、分析器

让mysql知道我们要做什么

mysql服务器连接后,分析器会分析我们的sql语句,是否语法正确等。例如:

elect id from table where id = 1;

他会爆语句错误

You have an error in your SQL syntax; check the manual that corresponds to your OceanBase version for the right syntax to use near 'elect id from table where id = 1' at line 1

在我们执行sql报错时,他语句错误开始的地方通常是在’use near’后面,所以我们出现错误时重点关注其后面语句即可。

select id from table where id = 1;

在分析器分析这条语句时,会根据select来判断他是查询语句,根据table判断表,根据where判断条件

3、处理器-prepare阶段

转化sql语句

在这个阶段,MySQL服务器会对SQL语句进行解析和准备,包括参数绑定、语法解析、语义检查等操作。这个阶段会将SQL语句转化为内部表示形式,以供后续的处理。

例如:

1、判断字段、表是否存在

2、select * 将*扩展成字段

4、优化器

确定sql执行方案

经过分析器,mysql知道了我们这条语句要做什么了,那优化器又是做什么的呢?

优化器其实是用来确定最后的执行方案的,即最后的sql语句如何执行在这里进行确定。

例如:是否走索引,多个索引的情况决定使用哪个索引,或者在有多表关联时,确定先关联哪个表,后关联哪个表。

5、执行器

执行sql语句

在经过优化器确定sql执行方案后,执行器负责最后的sql执行。

例如:

select id from table where id = 1;

执行流程:

1、判断是否有表权限

2、调用InnoDB引擎接口取这个表的第一行,判断ID值是不是1,如果不是则跳过,如果是则将这行存在结果集中;

3、调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。

4、执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。

至此,mysql的执行就完成了。

6、总结

执行流程

image.png

7、问题思考

在执行sql时没有列会爆错误:unknown column ‘k’ in ‘where clause,这个是在哪个阶段出现的呢?

在mysql8.0在分析器与优化器阶段之间还有一个预处理器-prepare阶段, 这个阶段是用来进行1、判断表和字段是否存在;1、把select * 里面的*扩展为字段。 在8之前属于分析器阶段进行判断。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值