MYSQL高级(架构篇)——SQL的执行过程

一、MySQL的逻辑架构

概述

MySQL是典型的C/S架构,服务器端采用mysqld。

服务器与客户端通信的结果是:客户端进程向服务器发送一段SQL语句,服务器进程 处理后再向客户端进程发送一段文本(处理结构)

服务器具体对一个请求的处理过程可以由如下的图所展示:

MYSQL高级(架构篇)——SQL的执行过程_第1张图片
所以,实际上MySQL Server结构可以分为如下三层:

  1. 连接层:客户端和服务器端建立连接,客户端发送 SQL 至服务器端;
  2. 服务层(SQL层):对 SQL 语句进行查询处理;与数据库文件的存储方式无关;
  3. 存储引擎层:与数据库文件打交道,负责数据的存储和读取。

1.1、第一层:连接层

系统(客户端)访问 MySQL 服务器前,做的第一件事就是建立 TCP 连接。 经过三次握手建立连接成功后, MySQL 服务器对 TCP 传输过来的账号密码做身份认证、权限获取。

  • 用户名或密码不对,会收到一个Access denied for user错误,客户端程序结束执行
  • 用户名密码认证通过,会从权限表查出账号拥有的权限与连接关联,之后的权限判断逻辑,都将依赖于此时读到的权限

TCP 连接收到请求后,必须要分配给一个线程专门与这个客户端的交互。所以还会有个线程池,去走后面的流程。每一个连接从线程池中获取线程,省去了创建和销毁线程的开销。

所以连接管理的职责是负责认证、管理连接、获取权限信息。

1.2、第二层:服务层

第二层架构主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化及部分内置函数的执行。
在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化:如确定查询表的顺序,是否利用索引等,最后生成相应的执行操作。

1.3、第三层:引擎层

插件式存储引擎层( Storage Engines),真正的负责了MySQL中数据的存储和提取,对物理服务器级别维护的底层数据执行操作,服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同,这样 我们可以根据自己的实际需要进行选取。

所以,我们可以把MySQL架构简化为:MYSQL高级(架构篇)——SQL的执行过程_第2张图片


二、SQL的执行流程

MYSQL高级(架构篇)——SQL的执行过程_第3张图片

MySQL的查询流程:

  1. 查询缓存:Server 如果在查询缓存中发现了这条 SQL 语句,就会直接将结果返回给客户端;如果没有,就进入到解析器阶段。需要说明的是,因为查询缓存往往效率不高,所以在 MySQL8.0 之后就抛弃了这个功能。
  2. 解析器:在解析器中对 SQL 语句进行语法分析、语义分析。若SQL正确,即生成语法树
  3. 优化器:在优化器中会确定 SQL 语句的执行路径,比如是根据 全表检索 ,还是根据 索引检索 等。一条查询可以有很多种执行方式,最后都返回相同的结果。优化器的作用就是找到这其中最好的执行计划。
  4. 执行器:在执行之前需要判断该用户是否 具备权限 。如果没有,就会返回权限错误。如果具备权限,就执行 SQL 查询并返回结果。在 MySQL8.0 以下的版本,如果设置了查询缓存,这时会将查询结果进行缓存。

综上,SQL 语句在 MySQL 中的流程是: SQL语句查询缓存解析器优化器执行器

在这里插入图片描述

你可能感兴趣的:(mysql,sql,数据库)