专栏目录请点击
简介
我们先看这一张图
他可以简化成如下
查询过程
- 首先MysQL是典型的C/S架构,即
Client/Server
架构,服务器端程序使用的mysqld
。 - 不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段文本(SQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果)。
- 具体我们可以看下面的图
- 我们会发现整个处理过程可以分三个大部分
- 连接管理
- 解析与优化
- 存储引擎
mysql8.0中没有查询缓存这个步骤。文件系统里面物理磁盘上的文件先加载到存储引擎当中。
- 所以上面的图大概可以分为下面的三层
- 我们来详细介绍这些模块
连接管理
-
每个客户端连接成功,都会在服务器进程中拥有一个线程,服务器会缓存线程,该线程只能轮流在某个CPU中运行,所以不需要创建和销毁线程
-
通过sDK来访问MysQL,本质上还是在TCP连接上通过MysQL协议跟MysQL进行交互。
Connectors
- connectors,指的是不同语言中与MYSQL的交互。
- 系统(客户端)访问MySQL服务器前,做的第一件事就是建立TCP连接。经过三次握手建立连接成功后,MysQL服务器对TCP传输过来的账号密码做身份认证、权限获取。
- TCP连接收到请求后,必须要分配给一个线程专门与这个客户端的交互。所以还会有个线程池,去走后面的流程。每一个连接从线程池中获取线程,省去了创建和销毀线程的开销,如下图
解析优化查询
这里属于第二层服务层
- 在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化
- 如确定查询表的顺序,是否利
用索引等,最后生成相应的执行操作。 - 如果是SELECT语句,服务器还会查询内部的缓存。
- 如确定查询表的顺序,是否利
SQL Interface
SQL接口
- 用于接收用户的SQL命令,并且返回用户需要查询的结果。查询语句就是调用
SQL Interface
- 它支持DML、DDL、存储过程、视图、触发器、自定义函数等多种SQL语言。
Parser
解析器
- 在解析器中对于SQL语句进行语法分析和语义分析,将SQL语句分解成数据结构,并将这个结构传递到后序的步骤,以后SQL语句的传递和处理就是基于这个结构。
- 如果在分解构成中遇到了错误,那么就说明这个SQL语句是不合理的。
- 在SQL命令传递到解析器的过程中会被解析器验证和解析,并为其创建语法树,并根据数据字典丰富查询语法树,会验证该客户端是否具有执行该查询的权限。
- 创建好语法树后,MYSQL还会对SQL查询进行语法上的优化,进行查询重写。
Optimizer
查询优化器
- SQL语法在语法解析之后、查询之前会使用查询优化器确定SQL语句的执行路径,生成一个执行计划。
- 这个执行计划表明应该使用那些索引进行查询(全表索引还是使用索引检索),表之间的链接顺序如何,最后会暗号执行计划中的步骤调用存储引擎提供的方法来真正的执行查询,并将查询结果返回给用户
查询策略
他使用的是选取-投影-链接
的策略进行查询
SELECT id,name FROM student WHERE gender = '男';
- 他会先对于
WHERE
语句进行选取, - 然后根据id和name进行属性的投影
- 将上面的两个查询条件链接起来生成最终的查询结果
Caches & Buffers
查询缓存组件
- MySQL内部维持着一些Cache和Buffer
- 这个缓存机制是有一系列的小缓存组成。比如表缓存,记录缓存,key缓存,权限缓存等,且可以在不同的客户端之间共享
- 从MySQL5.7.20之后,在推荐使用查询缓存,并在MySQL8.0中删除
存储
这属于第三层
- 存储引擎层,真正负责了MYSql中的数据的存储和提取,对物理服务器级别维护的地城数据执行操作。
- 存储引擎详解点击
存储层
- 所有的数据、数据库、表的每一行的内容,索引,都是存在文件系统上,以文件的方式存在的,并完成与存储引擎的交互。
- 有些存储引擎,也不支持使用文件系统直接管理裸设备,比如InnoDB。
- 文件系统可以是会用本地磁盘,也可以使用DAS、NAS、SAN等各种存储系统
参考