重学MySQL系列01-揭开面纱,显露架构

沙海 2021年7月15日01:05:38Java评论41字数 2408阅读8分1秒阅读模式
摘要

智能摘要

智能摘要文章源自JAVA秀-https://www.javaxiu.com/37872.html

为了解决这种知其然而不知其所以然的问题,阿星的重学MySQL系列会带着大家去探索MySQL底层原理的方方面面。当然不是,多个系统都可以和MySQL服务器建立连接,每个系统建立的连接肯定不止一个。通过了分析器,说明SQL字符串符合语法规范,现在MySQL服务器要执行SQL语句了。你需要产出执行计划,交给MySQL服务器执行,所以来到了优化器阶段。其中连接管理与解析与优化处于MySQL架构中的Server层。文章源自JAVA秀-https://www.javaxiu.com/37872.html

原文约 2018 | 图片 12 | 建议阅读 5 分钟 | 评价反馈文章源自JAVA秀-https://www.javaxiu.com/37872.html

重学MySQL系列01-揭开面纱,显露架构

菜鸟要飞 文章源自JAVA秀-https://www.javaxiu.com/37872.html

以下文章来源于程序猿阿星,作者点击关注 ?文章源自JAVA秀-https://www.javaxiu.com/37872.html

文章源自JAVA秀-https://www.javaxiu.com/37872.html

重学MySQL系列01-揭开面纱,显露架构文章源自JAVA秀-https://www.javaxiu.com/37872.html

程序猿阿星文章源自JAVA秀-https://www.javaxiu.com/37872.html

一起成长进阶!专注技术原理、源码,通过图解方式输出技术,这里将会分享操作系统、计算机网络、Java、分布式、数据库等精品原创文章文章源自JAVA秀-https://www.javaxiu.com/37872.html

文章源自JAVA秀-https://www.javaxiu.com/37872.html

文章源自JAVA秀-https://www.javaxiu.com/37872.html

前言文章源自JAVA秀-https://www.javaxiu.com/37872.html

目前大部分的后端开发人员对MySQL的理解可能停留在一个黑盒子阶段。文章源自JAVA秀-https://www.javaxiu.com/37872.html

MySQL基本使用没什么问题,比如建库、建表、建索引,执行各种增删改查。文章源自JAVA秀-https://www.javaxiu.com/37872.html

所有很多后端开发人员眼中的MySQL如下图所示文章源自JAVA秀-https://www.javaxiu.com/37872.html

重学MySQL系列01-揭开面纱,显露架构文章源自JAVA秀-https://www.javaxiu.com/37872.html

导致在实际工作中碰到MySQL中死锁异常、SQL性能太差、异常报错等问题时,直接百度搜索。文章源自JAVA秀-https://www.javaxiu.com/37872.html

然后跟着博客捣鼓就解决了,可能自己都没搞明白里面的原理。文章源自JAVA秀-https://www.javaxiu.com/37872.html

为了解决这种知其然而不知其所以然的问题,阿星的重学MySQL系列会带着大家去探索MySQL底层原理的方方面面。文章源自JAVA秀-https://www.javaxiu.com/37872.html

这样大家碰到MySQL的一些异常或者问题时,能够直戳本质,快速地定位解决。文章源自JAVA秀-https://www.javaxiu.com/37872.html

连接管理

系统(客户端)访问MySQL服务器前,做的第一件事就是建立TCP连接。文章源自JAVA秀-https://www.javaxiu.com/37872.html

经过三次握手建立连接成功后,MySQL服务器对TCP传输过来的账号密码做身份认证、权限获取。文章源自JAVA秀-https://www.javaxiu.com/37872.html

  • 用户名或密码不对,会收到一个Access denied for user错误,客户端程序结束执行文章源自JAVA秀-https://www.javaxiu.com/37872.html

  • 用户名密码认证通过,会从权限表查出账号拥有的权限与连接关联,之后的权限判断逻辑,都将依赖于此时读到的权限文章源自JAVA秀-https://www.javaxiu.com/37872.html

接着我们来思考一个问题文章源自JAVA秀-https://www.javaxiu.com/37872.html

一个系统只会和MySQL服务器建立一个连接吗?文章源自JAVA秀-https://www.javaxiu.com/37872.html

只能有一个系统和MySQL服务器建立连接吗?文章源自JAVA秀-https://www.javaxiu.com/37872.html

当然不是,多个系统都可以和MySQL服务器建立连接,每个系统建立的连接肯定不止一个。文章源自JAVA秀-https://www.javaxiu.com/37872.html

所以,为了解决TCP无限创建与TCP频繁创建销毁带来的资源耗尽、性能下降问题。文章源自JAVA秀-https://www.javaxiu.com/37872.html

MySQL服务器里有专门的TCP连接池限制接数,采用长连接模式复用TCP连接,来解决上述问题。文章源自JAVA秀-https://www.javaxiu.com/37872.html

重学MySQL系列01-揭开面纱,显露架构文章源自JAVA秀-https://www.javaxiu.com/37872.html

TCP连接收到请求后,必须要分配给一个线程去执行,所以还会有个线程池,去走后面的流程。文章源自JAVA秀-https://www.javaxiu.com/37872.html

这些内容我们都归纳到MySQL连接管理组件中。文章源自JAVA秀-https://www.javaxiu.com/37872.html

所以连接管理的职责是负责认证、管理连接、获取权限信息。文章源自JAVA秀-https://www.javaxiu.com/37872.html

解析与优化

经过了连接管理,现在MySQL服务器已经获取到SQL字符串。文章源自JAVA秀-https://www.javaxiu.com/37872.html

如果是查询语句,MySQL服务器会使用select SQL字符串作为key文章源自JAVA秀-https://www.javaxiu.com/37872.html

去缓存中获取,命中缓存,直接返回结果(返回前需要做权限验证),未命中执行后面的阶段,这个步骤叫查询缓存文章源自JAVA秀-https://www.javaxiu.com/37872.html

重学MySQL系列01-揭开面纱,显露架构文章源自JAVA秀-https://www.javaxiu.com/37872.html

需要注意,select SQL字符串要完全匹配,有任何不同的地方都会导致缓存不被命中(空格、注释、大小写、某些系统函数)。文章源自JAVA秀-https://www.javaxiu.com/37872.html

小贴士:虽然查询缓存有时可以提升系统性能,但也不得不因维护这块缓存而造成一些开销,从MySQL 5.7.20开始,不推荐使用查询缓存,并在MySQL 8.0中删除。文章源自JAVA秀-https://www.javaxiu.com/37872.html

没有命中缓存,或者非select SQL就来到分析器阶段了。文章源自JAVA秀-https://www.javaxiu.com/37872.html

因为系统发送过来的只是一段文本字符串,所以MySQL服务器要按照SQL语法对这段文本进行解析。文章源自JAVA秀-https://www.javaxiu.com/37872.html

重学MySQL系列01-揭开面纱,显露架构文章源自JAVA秀-https://www.javaxiu.com/37872.html

如果你的SQL字符串不符合语法规范,就会收到You have an error in your SQL syntax错误提醒文章源自JAVA秀-https://www.javaxiu.com/37872.html

通过了分析器,说明SQL字符串符合语法规范,现在MySQL服务器要执行SQL语句了。文章源自JAVA秀-https://www.javaxiu.com/37872.html

MySQL服务器要怎么执行呢?文章源自JAVA秀-https://www.javaxiu.com/37872.html

你需要产出执行计划,交给MySQL服务器执行,所以来到了优化器阶段。文章源自JAVA秀-https://www.javaxiu.com/37872.html

重学MySQL系列01-揭开面纱,显露架构文章源自JAVA秀-https://www.javaxiu.com/37872.html

优化器不仅仅只是生成执行计划这么简单,这个过程它会帮你优化SQL语句。文章源自JAVA秀-https://www.javaxiu.com/37872.html

外连接转换为内连接、表达式简化、子查询转为连接、连接顺序、索引选择等一堆东西,优化的结果就是执行计划。文章源自JAVA秀-https://www.javaxiu.com/37872.html

截止到现在,还没有真正去读写真实的表,仅仅只是产出了一个执行计划。文章源自JAVA秀-https://www.javaxiu.com/37872.html

于是就进入了执行器阶段,MySQL服务器终于要执行SQL语句了。文章源自JAVA秀-https://www.javaxiu.com/37872.html

重学MySQL系列01-揭开面纱,显露架构文章源自JAVA秀-https://www.javaxiu.com/37872.html

开始执行的时候,要先判断一下对这个表有没有相应的权限,如果没有,就会返回权限错误。文章源自JAVA秀-https://www.javaxiu.com/37872.html

如果有权限,根据执行计划调用存储引擎API对表进行的读写。文章源自JAVA秀-https://www.javaxiu.com/37872.html

重学MySQL系列01-揭开面纱,显露架构文章源自JAVA秀-https://www.javaxiu.com/37872.html

存储引擎API只是抽象接口,下面还有个存储引擎层,具体实现还是要看表选择的存储引擎。文章源自JAVA秀-https://www.javaxiu.com/37872.html

讲到这里,上面提到的查询缓存、分析器、优化器、执行器都可以归纳到MySQL解析与优化组件中。文章源自JAVA秀-https://www.javaxiu.com/37872.html

所以解析与优化的职责如下:文章源自JAVA秀-https://www.javaxiu.com/37872.html

  • 缓存文章源自JAVA秀-https://www.javaxiu.com/37872.html

  • SQL语法解析验证文章源自JAVA秀-https://www.javaxiu.com/37872.html

  • SQL优化并生成执行计划文章源自JAVA秀-https://www.javaxiu.com/37872.html

  • 根据执行计划调用存储引擎接口文章源自JAVA秀-https://www.javaxiu.com/37872.html

重学MySQL系列01-揭开面纱,显露架构文章源自JAVA秀-https://www.javaxiu.com/37872.html

其中连接管理解析与优化处于MySQL架构中的Server层。文章源自JAVA秀-https://www.javaxiu.com/37872.html

小结

在学习任何知识前,先不要着急的陷入细节,而是先了解大致脉络,有个全局观,之后再去深入相关的细节。文章源自JAVA秀-https://www.javaxiu.com/37872.html

MySql架构分为Servce层与存储引擎层。文章源自JAVA秀-https://www.javaxiu.com/37872.html

连接管理、解析与优化这些并不涉及读写表数据的组件划分到Servce层,读写表数据而是交给存储引擎层来做。文章源自JAVA秀-https://www.javaxiu.com/37872.html

通过这种架构设计,我们发现Servce层其实就是公用层,存储引擎层就是多态层,按需选择具体的存储引擎。文章源自JAVA秀-https://www.javaxiu.com/37872.html

再细想下,它和模板方法设计模式一摸一样,它们的执行流程是固定的,Servce层等于公用模板函数,存储引擎层等于抽象模板函数,按需子类实现。文章源自JAVA秀-https://www.javaxiu.com/37872.html

阿星最后以一张MySQL简化版的架构图结束本文,我们下期再见~文章源自JAVA秀-https://www.javaxiu.com/37872.html

重学MySQL系列01-揭开面纱,显露架构文章源自JAVA秀-https://www.javaxiu.com/37872.html

站在巨人的肩膀上:文章源自JAVA秀-https://www.javaxiu.com/37872.html

  • 《MySQL实战45讲》文章源自JAVA秀-https://www.javaxiu.com/37872.html

  • 《从零开始带你成为MySQL实战优化高手》文章源自JAVA秀-https://www.javaxiu.com/37872.html

  • 《MySQL是怎样运行的:从根儿上理解MySQL》文章源自JAVA秀-https://www.javaxiu.com/37872.html

  • 《MySQL技术Innodb存储引擎》文章源自JAVA秀-https://www.javaxiu.com/37872.html

重学MySQL系列01-揭开面纱,显露架构文章源自JAVA秀-https://www.javaxiu.com/37872.html

推荐阅读文章源自JAVA秀-https://www.javaxiu.com/37872.html

嘘!刚刚发现了一个山寨版某库....文章源自JAVA秀-https://www.javaxiu.com/37872.html

可怕!公司部署了一个东西,悄悄盯着你···文章源自JAVA秀-https://www.javaxiu.com/37872.html

发小被绿,我竭尽所学黑科技,动用云控捉奸寻找证据….文章源自JAVA秀-https://www.javaxiu.com/37872.html

终于把废旧电脑变成了服务器!差点被女票拿去换洗脸盆,真香!

重学MySQL系列01-揭开面纱,显露架构文章源自JAVA秀-https://www.javaxiu.com/37872.html

继续阅读
速蛙云 - 极致体验,强烈推荐!!!购买套餐就免费送各大视频网站会员!快速稳定、独家福利社、流媒体稳定解锁!速度快,全球上网、视频、游戏加速、独立IP均支持!基础套餐性价比很高!这里不多说,我一直正在使用,推荐购买:https://www.javaxiu.com/59919.html
weinxin
资源分享QQ群
本站是JAVA秀团队的技术分享社区, 会经常分享资源和教程; 分享的时代, 请别再沉默!
沙海
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定