目录
[MySQL Server结构:](#MySQL Server结构:)
[SQL接口(SQL Interface):](#SQL接口(SQL Interface):)
[插件式存储引擎层(Storage Engines):](#插件式存储引擎层(Storage Engines):)
MySQL是典型的C/S架构,也就是Client/Server架构,服务器程序使用的mysql。
无论客户端进程和服务器进程是采用的哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段文本(SQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果)。

连接器(Connectors):
连接器指的是不同语言与SQL的交互。MySQL是一个网络程序,在TCP之上定义了自己的应用层协议。所以要使用MySQL,可以编写代码,与MySQL Server建立连接,按照其定义好的协议进行交互。或者使用比较方便的方法:调用SDK,本质上还是在TCP连接上通过MySQL协议与MySQL进行交互。
MySQL Server结构:
连接层:
连接池:
客户端访问MySQL服务器之前,首先就需要建立TCP连接,经过三次握手建立连接之后,MySQL服务器对TCP传输过来的账号密码做身份证、权限获取。
负责和客户端建立连接,获取权限,管理连接。
服务层:
完成大多数的核心服务功能。在该层会解析查询并创建相应的内部解析树,并对其完成相应的优化:如查询表的顺序,是否利用索引等,最后生成相应的执行操作。
如果是SELECT语句,服务器会查询内部的缓存。
SQL接口(SQL Interface):
接受用户的SQL命令,并返回用户需要查询的结果。
MySQL支持DML(数据操作语言)、DDL(数据定义语言)、存储过程、视图、触发器、自定义函数等多种SQL语言接口。
解析器(Paeser):
对SQL语句进行语法分析、语义分析。将SQL语句分解成数据结构,并将这个结构传递到后续步骤,之后SQL语句的传递和处理就是基于这个结构。如果分解结构中遇到错误,证明SQL语句不合理。
SQL命令传递到解析器的时候会被解析器验证和解析,并为其创建语法树,并根据数据字典丰富查询语法树,会验证客户端是否具有执行该查询的权限。创建好语法树之后,MySQL会对SQL查询进行语法上的优化,进行查询重写。
查询优化器(Optimizer):
SQL语句在语法解析之后、查询之前会使用查询优化器确定SQL语句的执行路径,生成一个执行计划。
执行计划表名应该使用哪些索引进行查询(全表索引还是索引检索),表之间的连接顺序如何,最后按照执行计划中的步骤调用存储引擎提供的方法来执行查询,并将查询结果返回给用户。
使用的是"选取-投影-连接"的策略进行查询。
查询缓存组件(Caches&Buffers):
MySQL内部维持着一次额Cache和Buffer,如果能够在其中找到对应的查询结果,那么就不再进行查询解析、优化和执行的整个过程,直接将结果反馈给客户端。
缓存机制是由一系列的小缓存组成的。如:表缓存、记录缓存、key缓存、权限缓存等。
这个查询缓存可以在不同客户端之间共享。
从MySQL5.7.20开始不推荐使用,并在MySQL8.0中删除。
引擎层:
MySQL可以在多种不同场景中应用并发挥良好的作用,主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其他的系统任务以及数据的存储提取相分离。这种架构可以根据需求进行选择。开源的MySQL还允许开发人员设置自己的存储引擎。
插件式存储引擎层(Storage Engines):
负责了MySQL中数据的存储和提取,对物理服务器级别维护的底层数据执行操作,服务器通过API与存储引擎进行通信。
查看支持的存储引擎:
cpp
show engines;
存储层:
所有的数据,数据库、表的定义,表的所有内容都是存在文件系统上,以文件的方式存在,并完成于存储引擎的交互。在文件系统下,可以使用本地磁盘,可以使用DAS、NAS、SAN等各种存储系统。
总结:

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

MySQL的查询流程:
查询缓存:
基本流程:
MySQL收到一个查询请求后,会进行缓存查询。因为之前执行过的语句及其结果可能会以key(查询语句)-value(查询结果)的形式,直接缓存在内存中。Server如果在查询缓存中发现了这条SQL语句,就会直接将结果返回客户端。如果没有的话,就会进入到解析器阶段,执行完成之后,执行结果会被存入查询缓存中。
查询缓存效率不高的原因:
MySQL中查询缓存,不是缓存查询计划,而是查询对应的结果。查询匹配的鲁棒性大大降低,只有相同的查询操作才会命中查询缓存。任何字符上的不同,都会导致不会命中。
MySQL的缓存系统会检测涉及到的每一张表,只要表的结构或者数据被修改,那么该表的所有高速缓存查询都将变为无效并从高速缓存中删除。一旦更新修改频率高,命中率就会非常低。
MySQL8.0之后抛弃了这个功能。
解析器:
基本流程:
先做"词法分析"识别出字符串,之后接着"语法分析",根据语法分析的结果,语法分析器根据语法规则,判断SQL语句是否满足MySQL语法。如果SQL语句正确,则会生成一个语法树。
优化器:
在优化器中会确定SQL语句的执行路径怎么做效率是最好的,如是全表检索还是索引检索等。也就是找到最好的执行计划。最后生成执行计划。
查询优化器中,可以分为逻辑查询优化阶段和物理查询优化阶段。
逻辑查询优化:通过改变SQL语句的内容来使得SQL查询更高效,同时为物理查询优化提供更多的候选执行计划。通常采用的方式是对SQL语句进行等价交换,对查询进行重写。
物理查询优化:基于关系代数进行的查询重写。在这个阶段里,对于单表和多表的连接操作,需要高效地使用索引,提高查询效率。
执行器:
在执行之前需要判断该用户是否具备权限。如果没有权限,则会返回权限错误,如果具有权限(就执行SQL查询并返回结果),就打开表继续执行,打开表的时候,执行器会根据表的引擎定义,调用存储引擎API对表进行读写。
总结:
SQL语句在MySQL中的流程是:SQL语句->查询缓存->解析器->优化器->执行器。
查询缓存:对查询语句进行缓存查询,如果该语句存在,那么直接返回给客户端,不再进行之后的操作。如果该语句不存在,那么则进入到解析器阶段。
解析器:对SQL语句进行"词法分析"识别出字符串,然后进行"语法分析"。如果SQL语句成功,则生成一个语法树。
优化器:对语句进行优化,选择索引,确定语句的执行方案。最后生成执行计划。
执行器:对该用户判断是否具有权限,如果没有权限,则会返回权限错误。如果具有权限,继续打开表执行,根据表的引擎定义,调用存储引擎API进行读写。通过这个引擎提供的接口获得数据并返回给客户端。