MySQL逻辑架构
本专栏学习内容来自尚硅谷宋红康老师的视频
有兴趣的小伙伴可以点击视频地址观看
1. 逻辑架构解析
1.1 服务器处理客户端请求
MySQL是经典的C/S架构,不论客户端进程和服务器进程采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段sql语句,服务器进程处理后再向客户端进程发送处理结果
如下图所示,服务器进程对客户端进程做了以下处理,才会返回最后处理结果
1.2 Connectors
Connectors被称为连接器,其中包括Java、C、Python的客户端都可以是连接器,向MySQL服务器发送请求
1.3 连接层
客户端访问MySQL服务器前,第一件事就是要建立TCP连接
经过三次握手建立连接成功后,MySQL服务器对TCP传输过来的账号密码做身份认证、权限获取
- 用户名或密码不对,会收到一个Access denied for user错误,客户端程序结束执行
- 用户名密码认证通过,会从权限表查出账号所拥有的权限与连接关联,之后的权限判断逻辑,都将依赖此时读到的权限
1.4 服务层
服务层完成大多数核心服务功能,包括查询解析、分析、优化、以及所有的内置函数,所有跨存储引擎的功能也都在这一层实现:存储过程、触发器、视图等
1.5 引擎层
存储引擎负责MySQL中数据的存储和提取,每个存储引擎都有优势和劣势,服务器通过存储引擎API进行通行。
1.6 存储层
所有的数据,数据库、表的定义,表的每一行的内容、索引,都是存储在文件系统上,以文件的方式存在的,并完成与存储引擎的交互。
2. SQL执行流程
2.1 MySQL重的SQL执行流程
MySQL的查询流程
-
查询缓存:Server如果在查询缓存中发现了这条SQL语句,就会直接将结果返回给客户端;如果没有,就进入到解析器阶段。
MySQL的缓存是以Key-Value格式保存的,其中Key为查询的SQL语句,那么就会出现以下几种问题
- 必须要求SQL语句完全相同,假设多一个空格或者大小写不一样,就不能命中缓存
- 如果SQL语句中有调用
now()
函数,那么缓存的查询结果是无效的 - 对缓存的数据执行了update或delete方法,但缓存没有删除
-
解析器:分析器会先做词法分析,MySQL需要识别出字符串中分别是什么,代表什么;接着会做语法分析,会根据语法规则,判断SQL语句是否满足MySQL语法。如果SQL语句正确,则会生成语法树
-
优化器:会确定SQL语句的执行路径,比如是根据全表检索还是根据索引检索等,
经过了解析器,在开始执行之前,还是要先经过优化器的处理。一条查询可以有很多种执行方式,最后都会返回相同的结果。优化器的作用就是找到其中最好的执行计划
-
执行器:调用存储引擎API对表进行读写