逻辑架构与SQL执行流程
1.逻辑架构剖析
1.1 服务器处理客户端请求
首先MySQL是典型的C/S架构,即Client/Server 架构,服务器端程序使用的mysqld。
不论客户端进程和服务器端进程是采用那种方式通信,最后实现效果是:客户端进程向服务器端进程发送一段文本(SQL语句),服务器端进程处理后再向客户端进程发送一段文本(处理结果)。
那服务器进程对客户端进程发送的请求做了什么处理,才能产生最后的处理结果呢?这里以查询请求为例展示:
下面具体展开看一下:
-
连接器:MySQL服务器之外的客户端程序(与具体语言有关系)
-
基础服务组件
-
连接池:数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正式针对这个问题提出来的.数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
-
SQL接口:接受SQL指令,并放回结果
-
解析器:语法解析,语义解析,生成语法树
-
优化器:对SQL语句进一步优化
-
查询缓存:以K-V方式缓存查询结果(因为命中率太低作用不大,然后MySQL8.0已经移除)
-
插件式的存储引擎:与底层的文件系统交互
-
文件系统
-
日志文件
1.2 Connectors
Connectors,指的是不同语言中与SQL的交互。MySQL首先是一个网络程序,在TCP之上定义了自己的应用协议,所以要使用MySQL,我们可以编写代码,跟MySQL Server建立TCP连接,之后按照其定义好的协议进行交互,或者比较方便的方法是调用SDK,比如Native C API ,JDBC,PHP等各种语言MySQL Connector,或者通过ODBC,但通过SDK 来访问MySQL,本质上还是在TCP来连接上通过MySQL协议跟MySQL进行交互。
MySQL Server 结构上可以分为如下三层:
1.3 第1层:连接层
-
系统(客户端)访问 MySQL 服务器前,做的第一件事就是建立 TCP 连接。
-
经过三次握手建立连接成功后, MySQL 服务器对 TCP 传输过来的账号密码做身份认证、权限获取。
- 用户名或密码不对,会收到一个Access denied for user错误,客户端程序结束执行
- 用户名密码认证通过,会从权限表查出账号拥有的权限与连接关联,之后的权限判断逻辑,都将依赖于此时读到的权限
一个系统(客户端)和MySQL服务器只能建立一个TCP链接吗?最多只有一个系统(客户端)与MySQL服务器建立连接吗?
答案:不是,多个系统都可以同时与MySQL服务器建立连接,而且每个系统与MySQL建立多个TCP连接。为了解决TCP无限创建,导致资源耗尽,从而性能下降问题,MySQL服务器端有专门的TCP连接池限制连接数,采用了长连接模式复用TCP连接。(长连接是发送完一次tcp请求之后,连接不断开,可以继续发送。)
-
TCP 连接收到请求后,必须要分配给一个线程专门与这个客户端的交互。所以还会有个线程池,去走后面的流程。每一个连接从线程池中获取线程,省去了创建和销毁线程的开销。
1.4 第2层:服务层
第二层架构主要完成大多数核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析优化部分内置函数的执行,所以跨存储引擎的功能也在这个一层实现,如过程,函数等。
在该层,服务器会解析查询并创建解析树,并对其完成相应的优化:如确定查询表的顺序,是否利用索引等,最后生成相应的执行操作。
如果是SELECT语句,服务器还会查询内部的缓存,如果缓存空间足够大,这样在解决大量读操作的环境中能够发挥好的提升系统的作用。
-
SQL Interface: SQL接口
- 接收用户的SQL命令,并且返回用户需要查询的结果。比如SELECT … FROM就是调用SQL Interface
- MySQL支持DML(数据操作语言)、DDL(数据定义语言)、存储过程、视图、触发器、自定义函数等多种SQL语言接口
-
Parser: 解析器
- 在解析器中对 SQL 语句进行语法分析、语义分析。将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。如果在分解构成中遇到错误,那么就说明这个SQL语句是不合理的。
- 在SQL命令传递到解析器的时候会被解析器验证和解析,并为其创建 语法树 ,并根据数据字典丰富查询语法树,会 验证该客户端是否具有执行该查询的权限 。创建好语法树后,MySQL还会对SQl查询进行语法上的优化,进行查询重写。
-
Optimizer: 查询优化器
-
SQL语句在语法解析之后、查询之前会使用查询优化器确定 SQL 语句的执行路径,生成一个执行计划 。
-
这个执行计划表明应该 使用哪些索引 进行查询(全表检索还是使用索引检索),表之间的连接顺序如何,最后会按照执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将查询结果返回给用户。
-
它使用“ 选取-投影-连接 ”策略进行查询。例如:
SELECT id,name FROM student WHERE gender
-