mysql中一条select语句是怎么执行的?

426 阅读3分钟

mysql主体

MySQL 从大方向来说,可以分为 Server 层和存储引擎层。而 Server 层包括连接器、查询缓存、解析器、预处理器、优化器、执行器等,最后 Server 层再通过 API 接口形式调用对应的存储引擎层提供的接口来执行增删改查操作。

语句的执行流程:

  1. 客户端发起一个请求时,首先会建立一个连接。
  2. 服务端会检查缓存,如果命中则直接返回,否则继续之后后面步骤。(缓存用的比较少,而且在8之后,直接默认关闭了).
  3. 服务器端根据收到的 sql 语句进行解析,然后对其进行词法分析,语法分析以及预处理。
  4. 由优化器生成执行计划。
  5. 调用存储引擎层 API 来执行查询。
  6. 返回查询到的结果。

1.建立连接

mysql使用的是半双工协议,通信的时候,数据可以双向传输,但是同一时间只能有一台服务器在发送数据,半双工协议让 MySQL 通信简单快速,但是也在一定程度上限制了 MySQL 的性能,因为一旦从一端开始发送数据,另一端必须要接收完全部数据才能做出响应。所以说我们批量插入的时候尽量拆分成多次插入而不要一次插入太大数据,同样的查询语句最好也带上 limit 限制条数,避免一次返回过多数据。

2.解析

这一步主要的工作首先就是检查 sql 语句的语法对不对,并且能识别出关键字和非关键字,然后根据 sql 语句生成一个数据结构,也叫做解析树(select_lex)。

3.优化

而对一个查询语句,尤其是复杂的多表查询语句,我们可以有很多种执行方式,每种执行方式的效率也不一样,所以这时候就需要查询优化器去选择一种它认为最高效的执行方式。

查询优化器的目的就是根据解析树生成不同的执行计划(Execution Plan),然后选择一种最优的执行计划,MySQL 里面使用的是基于开销(cost)的优化器,哪种执行计划开销最小,就选择哪种。

4.引擎查询

当 Server 层得到了一条 sql 语句的执行计划后,这时候就会去调用存储引擎层对应的 API 来执行查询了。因为 MySQL 的存储引擎是插件式的,所以每种存储引擎都会对 Server 提供了一些对应的 API 进行调用。

5.返回结果

最后,将查询出得到的结果返回 Server 层,如果有且开启了缓存,Server 层返回数据的同时还会写入缓存。

MySQL 将查询结果返回是一个增量的逐步返回过程。例如:当我们处理完所有查询逻辑并开始执行查询并且生成第一条结果数据的时候,MySQL 就可以开始逐步的向客户端传输数据了。这么做的好处是服务端无需存储太多结果,从而减少内存消耗。