序目前大部分后端开发者对MySQL的理解可能还停留在黑箱阶段。MySQL的基本使用没有问题,比如建立数据库,表,索引,进行各种增删改。很多后端开发者眼中的MySQL如下图所示。在实际
目前大部分后端开发者对MySQL的理解可能还停留在黑箱阶段。
MySQL的基本使用没有问题,比如建立数据库,表,索引,进行各种增删改。
很多后端开发者眼中的MySQL如下图所示。
在实际工作中遇到MySQL中死锁异常、SQL性能差、异常报错等问题时,直接进行百度搜索。
然后就按照博客解决了,可能是我不懂原理。
要解决知其然而不知其所以然的问题,阿星的再学MySQL系列将带你探索MySQL底层原理的方方面面。
这样当你在MySQL中遇到一些异常或问题时,可以直接戳中本质,快速定位解决。
连接管理在系统(客户端)访问MySQL服务器之前,首先要做的就是建立TCP连接。
三次握手连接成功后,MySQL服务器对TCP传输的账号密码进行认证,获得权限。
用户名或密码不对,会收到一个Access denied for user错误,客户端程序结束执行
用户名密码认证通过,会从权限表查出账号拥有的权限与连接关联,之后的权限判断逻辑,都将依赖于此时读到的权限
那我们来思考一个问题。
一个系统只会和MySQL服务器建立一个连接吗?
只能有一个系统与MySQL服务器建立连接吗?
不可以,当然多个系统都可以和MySQL服务器建立连接,每个系统都必须建立一个以上的连接。
所以为了解决TCP无限创建和频繁创建销毁带来的资源枯竭和性能下降问题。
MySQL服务器中有专门的TCP连接池来限制连接数,使用长连接模式复用TCP连接来解决上述问题。
TCP收到请求后,必须分配给一个线程来执行,所以会有一个线程池来遵循下面的流程。
所有这些内容都在MySQL的连接管理组件中进行了总结。
因此连接管理的职责是负责认证、连接管理和访问授权信息。
分析和优化在连接管理之后,MySQL服务器现在已经获得了SQL字符串。
如果是查询语句,MySQL服务器将使用select SQL字符串作为键。
从缓存中获取,命中缓存,直接返回结果(返回之前需要进行权限验证)。未命中执行的后期阶段称为查询高速缓存。
注意select SQL字符串要完全匹配,任何差异都会导致缓存丢失(空 case,comments,case,一些系统函数)。
提示:虽然查询缓存有时可以提高系统性能,但是由于维护这个缓存,它也必须引起一些开销。从MySQL 5.7.20开始,不建议使用查询缓存,在MySQL 8.0中被删除。
没有缓存命中,或者非选择SQL进入分析器阶段。
因为系统只发送一个文本字符串,所以MySQL服务器应该根据SQL语法解析这个文本。
如果您的SQL字符串不符合语法规范,您将收到一条错误警告,指出您的SQL语法中有错误。
解析器显示SQL字符串符合语法规范,现在MySQL服务器将执行SQL语句。
如何执行MySQL服务器?
你需要输出执行计划,交给MySQL服务器执行,于是就到了优化器阶段。
优化器不仅仅是生成一个执行计划那么简单,它还会帮助你在这个过程中优化SQL语句。
如外连接转换为内连接、表达式简化、子查询转换为连接、连接顺序、索引选择等等,优化的结果就是执行计划。
到现在为止,我们还没有真正的读写真正的表,只是产生了一个执行计划。
于是我们进入了executor阶段,MySQL服务器终于要执行SQL语句了。
在开始执行的时候,需要判断这个表上是否有相应的权限。否则,它将返回一个权限错误。
如果有权限,调用存储引擎API根据执行计划读写表。
存储引擎API只是一个抽象接口,下面还有一个存储引擎层。具体实施取决于表中选择的存储引擎。
至此,上面提到的查询缓存、分析器、优化器和执行器都可以概括为MySQL的解析和优化组件。
因此分析和优化的职责如下:
缓存
SQL语法解析验证
SQL优化并生成执行计划
根据执行计划调用存储引擎接口
其中连接管理和解析和优化在MySQL架构的服务器层。
总结在学习任何知识之前,不要急于进入细节,而是先了解大致脉络,有全局观,再深入相关细节。
MySql架构分为服务器层和存储引擎层。
连接管理、解析和优化这些不涉及读写表数据的组件被划分到服务器层,读写表数据改为由存储引擎层完成。
通过这个架构设计,我们发现服务器层其实是公共层,存储引擎层是多态层,可以根据需要选择具体的存储引擎。
仔细想想,和模板方法设计模式一模一样。它们的执行流程是固定的,Servce层等于通用模板函数,存储引擎层等于抽象模板函数,可以按需子类化。
阿星最后以一个简化的MySQL架构图结束本文。下次见~
站在巨人的肩膀上:
《MySQL实战45讲》《从零开始带你成为MySQL实战优化高手》《MySQL是怎样运行的:从根儿上理解MySQL》《MySQL技术Innodb存储引擎》
关于我阿星是一个热爱技术的Java成人。微信官方账号“程徐苑阿星”定期分享有趣原创文章!
非常感谢小兄弟姐妹们看到这一幕。原创不容易。有帮助的文章可以关注,赞,分享,评论。他们都是支持的(不要问白嫖)!