SQL语句执行顺序

发布时间 2023-10-31 15:20:13作者: 桂洛克船长

查询语句执行流程

​ 可以看到总的分为两层: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 查询语句,从存储引擎读取记录,返回给客户端;