赞
踩
select id from table where id = 1;
那么思考一下,这一条sql语句在mysql中他是怎么的一个流程呢,内部是怎样执行的呢?
我们可以将Mysql执行的过程分为四个部分。(mysql8.0之后新增预处理器-prepare阶段)
建立客户端与MySQL服务器之间的连接,并进行身份验证和权限检查。
在我们执行sql的第一步,就是连接我们的mysql服务器,这个阶段会进行一些登陆以及权限校验操作。
让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判断条件
转化sql语句
在这个阶段,MySQL服务器会对SQL语句进行解析和准备,包括参数绑定、语法解析、语义检查等操作。这个阶段会将SQL语句转化为内部表示形式,以供后续的处理。
例如:
1、判断字段、表是否存在
2、select * 将*扩展成字段
确定sql执行方案
经过分析器,mysql知道了我们这条语句要做什么了,那优化器又是做什么的呢?
优化器其实是用来确定最后的执行方案的,即最后的sql语句如何执行在这里进行确定。
例如:是否走索引,多个索引的情况决定使用哪个索引,或者在有多表关联时,确定先关联哪个表,后关联哪个表。
执行sql语句
在经过优化器确定sql执行方案后,执行器负责最后的sql执行。
例如:
select id from table where id = 1;
执行流程:
1、判断是否有表权限
2、调用InnoDB引擎接口取这个表的第一行,判断ID值是不是1,如果不是则跳过,如果是则将这行存在结果集中;
3、调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。
4、执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。
至此,mysql的执行就完成了。
执行流程
在执行sql时没有列会爆错误:unknown column ‘k’ in ‘where clause,这个是在哪个阶段出现的呢?
在mysql8.0在分析器与优化器阶段之间还有一个预处理器-prepare阶段, 这个阶段是用来进行1、判断表和字段是否存在;1、把select * 里面的*扩展为字段。 在8之前属于分析器阶段进行判断。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。