写点什么

面试官:小伙子你来说说 MySQL 底层架构设计

作者:程序员小毕
  • 2022 年 7 月 29 日
  • 本文字数:1476 字

    阅读完需:约 5 分钟

面试官:小伙子你来说说MySQL底层架构设计

很多开发同学对 SQL 优化如数家珍,却对 MySQL 架构一知半解。岂不是只见树叶,不见森林,终将陷入细节中不能自拔。

今天就一块学习 MySQL 分层架构,深入了解 MySQL 底层实现原理,以及每层的作用,我们常见的 SQL 优化到底在哪一层做了优化?

1. MySQL 整体架构

由图中可以看到 MySQL 架构主要分为 Server 层存储引擎层

Server 层又分为连接器、缓存、分析器、优化器、执行器。所有跨存储引擎的功能都在这层实现,比如:函数、存储过程、触发器、视图等。

存储引擎是可插拔式的,常见的存储引擎有 MyISAM、InnoDB、Memory 等,MySQL5.5 之前默认的是 MyISAM,之后默认的是 InnoDB。



2. 连接器

连接器主要用来管理客户端的连接和用户身份认证。

客户端与 Server 端的连接采用的是 TCP 协议,经过 TCP 握手,建立连接之后,连接器开始进行身份验证。

> mysql -hlocalhost -P3306 -uroot -p
复制代码

如果认证失败,就会出现错误 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

可以通过 show processlist 命令查看系统所有连接的信息:



其中 Commond 列表示连接状态,Daemon 表示后台进程,Query 表示查询,Sleep 表示空闲连接。


相关视频解析:MySQL底层架构设计

3. 查询缓存

客户端请求不会直接去存储引擎查询数据,而是先在缓存中查询结果是否存在。如果结果已存在,直接返回,否则再执行一遍查询流程,查询结束后把结果再缓存起来。

如果数据表发生更改,将清空失效缓存,例如 insert、update、delete、alter 操作等。

对于频繁变更的数据表来说,缓存命中率很低。使用缓存反而降低了读写性能,所以在 MySQL8.0 以后就移除了缓存模块。

可以通过下面命令查看是否开启了缓存:



4. 分析器

分析器主要对 SQL 语句进行词法分析语法分析

首先进行词法分析,分析出 MySQL 的关键字、以及每个词语代表的含义。然后进行语法分析,检测 SQL 语句是否符合 MySQL 语法要求。

MySQL 通过识别字符串中列名、表名、where、select/update/insert 等 MySQL 关键字,在根据语法规则判断 sql 是否满足语法,最终会生成一个抽象语法树(AST)。

比如:SQL 语句中少写个 where 关键字,就会提示错误。

mysql> select * from user id=1;ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '=1' at line 1
复制代码

5. 优化器

在真正执行 SQL 语句之前,还需要经过优化器处理。

我们熟知的执行计划(Explain)就是优化器生成的。

优化器主要有两个作用:逻辑优化物理优化

逻辑优化主要进行等价谓词重写、条件化简、子查询消除、连接消除、语义优化、分组合并、选择下推、索引优化查询、表查询替换视图查询、Union 替换 or 操作等。

物理优化主要作用是通过贪婪算法,根据代价估算模型,估算出每种执行方式的代价。并使用索引优化表连接,最终生成查询执行计划。

附上 MySQL 优化器架构图,可以清晰的看到优化过程:



如果想知道优化器估算结果信息,可以通过 Explain 查看,关注一灯,下篇文章会详细讲解 Explain 具体用法。

6. 执行器

在优化器优化完 SQL,并生成了执行计划后,就会把执行计划传递给执行器。

执行器调用存储引擎接口,真正的执行 SQL 查询。获取到存储引擎返回的查询结果,并把结果返回给客户端,至此 SQL 语句执行结束。

7. 总结

本篇文章主要带大家了解了 MySQL 分层架构,以及每层的架构的作用。可以看出 MySQL 每层架构分工明确、逻辑清晰,深刻地体现了架构设计中“高内聚,低耦合”的设计思想。我们平时在做架构设计的时候,也要多学习一下这种分层架构的设计思想。

原文链接:https://www.cnblogs.com/yidengjiagou/p/16488991.html

用户头像

领取资料添加小助理vx:bjmsb2020 2020.12.19 加入

Java领域;架构知识;面试心得;互联网行业最新资讯

评论

发布
暂无评论
面试官:小伙子你来说说MySQL底层架构设计_Java_程序员小毕_InfoQ写作社区