SQL语句执行顺序
可以看到总的分为两层:Server层和储存引擎层
- Server层负责建立连接、分析和执行SQL。MySQL 大多数的核心功能模块都在这实现,主要包括连接器,查询缓存、解析器、预处理器、优化器、执行器等。另外,所有的内置函数(如日期、时间、数学和加密函数等)和所有跨存储引擎的功能(如存储过程、触发器、视图等。)都在 Server 层实现。
- 存储引擎层负责数据的存储和提取。支持 InnoDB、MyISAM、Memory 等多个存储引擎,不同的存储引擎共用一个 Server 层。现在最常用的存储引擎是 InnoDB。
一、连接器
- 与客户端进行TCP三次握手建立连接,MySQL是基于TCP连接的。
- 校验客户端的账号密码,如果账号或者密码不对就报错。
- 如果登录成功,会读取该用户的权限,后续操作都会基于此权限。
二、查询缓存
连接完成之后,客户端就可以向MySQL服务发送SQL语句了,MySQL会解析出第一个字段,如果是查询(select语句),MySQL 就会先去查询缓存( Query Cache )里查找缓存数据,看看之前有没有执行过这一条命令,这个查询缓存是以 key-value 形式保存在内存中的,key 为 SQL 查询语句,value 为 SQL 语句查询的结果。
如果查询的语句命中查询缓存,那么就会直接返回 value 给客户端。如果查询的语句没有命中查询缓存中,那么就要往下继续执行,等执行完后,查询的结果就会被存入查询缓存中。
三、解析SQL
在正式执行 SQL 查询语句之前, MySQL 会先对 SQL 语句做解析,这个工作交由「解析器」来完成。
解析器会做两件事:
- 词法分析。在正式执行 SQL 查询语句之前, MySQL 会先对 SQL 语句做解析,这个工作交由「解析器」来完成。
- 语法分析。根据词法分析的结果,语法解析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法,如果没问题就会构建出 SQL 语法树,这样方便后面模块获取 SQL 类型、表名、字段名、 where 条件等等。
四、执行SQL
经过解析器后,接着就要进入执行 SQL 查询语句的流程了,每条SELECT
查询语句流程主要可以分为下面这三个阶段:
-
prepare 阶段,也就是预处理阶段;
-
optimize 阶段,也就是优化阶段;
-
execute 阶段,也就是执行阶段;
1.预处理器
检查表或字段是否存在;将 select *
中的 *
符号扩展为表上的所有列。
2.优化阶段
基于查询成本的考虑, 选择查询成本最小的执行计划;
3.执行阶段
根据执行计划执行 SQL 查询语句,从存储引擎读取记录,返回给客户端;