服务器向客户端请求一共分别三层
第一层:连接层
第二层:服务层
第三层:引擎层
存储层
(1)服务器处理客户端请求
服务器进程对客户端进程发送的请求做了什么处理,才能产生最后的处理结果呢?
这里以请求为例展示:
下面具体看一下
第一层:连接层
系统(客户端)访问MySQL数据库之前,做的第一件事就是TCP连接。
经过三次握手成功后,MySQL服务器对TCP传输过来的账号密码做身份认证,权限获取。
1.用户名或密码不对,会收到一个Access denied for user错误,客户端程序结束执行。
2.用户密码认证通过,会从权限表查出账号拥有权限和连接关联,之后权限判断逻辑。都将依赖于此时读到的权限
TCP收到请求后,必须要分配给一个线程专门与这个客户段的交互。还会有个线程池。去走后面的流程。每个连接从线程池中获取
线程,省去了扩建和销毁线程的开销。
第二层:服务层
SQL Interface: SQL接口
1.接收客户sql命令,并返回用户需要查询的结果。比如:SELECT...FROM就是调用SQL interface
2.MySQL支持DML(数据操作语言),DDL(数据定义语言),存储过程,视图,触发器,自定义函数等多种SQL语言接口。
Parser: 解析器
1.在解析器中对SQL语句进行语法分析,语义分析。将SQL语句分析成数据结构,并将这个数据结构传递到后续步骤,以后的
SQL语句的传递和处理都是基于这个结构的。如果在分解构成中遇到错误,那么就说明这个SQL语句是不合理的。
2.在SQL命令传递到解说器的时候会被解说器验证和解析,并为其创建语法数,并根据数据字典丰富查询语法树,并根据数据
字典丰富查询语法树,会验证客户端是否具有执行该查询的权限。创建好语法树后。MySQL还要对SQL查询进行语法上的优化,
进行查询重写。
Optimizer: 查询优化器
1.SQL语句在语法解析之后,查询之前会使用查询优化器确定SQL语句的执行路径,生成一个执行计划。
2.这个执行计划表明应该使用哪些索引进行查询(全表检索还是使用索引检索),表之间的连接顺序如何,最后会按照执行
计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将查询结果反馈给用户。
3.它使用“选取-投影-连接”策略进行查询。
例如:SELECT id,name FROM student WHERE gender = '女';
这个SELECT查询先根据WHERE语句进行 选取,而不是将表全部查询出来以后再进行gender过滤。这个SELECT查询先根
据id和name进行属性 投影,而不是讲述想全部取出以后再进行过滤,将这两个查询 连接 起来生成最终查询结果。
Caches & Buffers: 查询缓存组件
1.MySQL内部维持着一些Cache和Buffer,比如Query Cache用来缓存一条SELECT语句的执行结果,如果能够在其中找到对
应的查询结果,那么就不必再进行查询解析,优化和执行的整个过程了,直接将结果反馈给客户端。
2.这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等。
3.这个查询缓存可以在不同客户端之间共享。
4.从MySQL5.7.20开始,不推荐使用查询缓存,并在MySQL8.0中删除,因为这个比较鸡肋
第三层:引擎层
插件式存储引擎层,真正的负责了MySQL中数据的存储和提取,对物理服务器级别维护的底层数据执行操作,服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。
MySQL 8。0.25默认支持的存储引擎如下:
存储层
所有数据,数据库,表定义,表的每一行的内容,索引,都是存在文件系统上,以文件在的,并完成与存储引擎的交互。当然有些存
储引擎比如innoDB,也支持不使用文件系统直接管理裸设备,的那现代文件系统的实现使得这样做没有必要了。在文件系统之下,可以
使用本地磁盘,可以使用DAS,NAS,SAN等各种存储系统。
总结
下面为了熟悉SQL执行流程方便,我们可以简化如下:
简化为三层结构:
1.连接层:客户端和服务器端建立连接,客户端发送SQL至服务器端;
2.SQL层(服务层):对SQL语句进行查询处理;与数据库文件的存储方式无关;
3.存储引擎层;与数据库打交道,负责数据的存储和读取。
标签:语句,逻辑,缓存,数据库,存储,查询,SQL,客户端,底层 From: https://www.cnblogs.com/gao-yf/p/17760149.html