你了解MySQL都包含哪些“零件“吗?

老师说:
作为一个后端开发,MySQL是我们常用的技术之一,也是面试中的高频面试题,那么你了解MySQL的基本架构吗?知道MySQL包含的各个"零件"和他们的作用吗?

下面我们就来聊一聊MySQL的架构。

一张鸟瞰图,先让大家有个基础的认识
在这里插入图片描述

是的没毛病,从上面的 MySQL 的逻辑架构图 中我们不难看出我们熟悉的MySQL可以分为Server 层和存储引擎层两部分。

而Server层中也是包含最多,最重要的部分,它包括连接器、查询缓存、分析器、优化器、执行器等等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学函数等),所有跨存储引擎的功能都在这一层实现,比如 存储过程、触发器、视图 等。

从上面这些信息相信大家也都能体会到Server层的重要性,而存储引擎层主要负责我们数据的存储和提取。我们也都知道MySQL支持很多存储引擎,可见其架构模式是插件式的,我们最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。

也就是说当你创建一张表并且没有指定存储引擎的时候,它就会默认使用InnoDB,当然你也可以指定你想要的存储引擎,下面的代码块中我已经给各位观众老爷准备好了,大家按需获取

create table 表明(
	字段
	...
)engine=存储引擎;

从我们上面的架构图也可以看出,不同的存储引擎对应了同一个Server层。

下面我们就一一的看看这些 ‘‘零件’’

连接器

首先我们需要连接到数据库,这个时候接待我们的就是连接器,它负责创建数据库连接
连接命令一般是这么写的:

mysql -h$ip -P$port -u$user -p

连接命令中的 mysql 是客户端工具,用来跟服务端建立连接。在完成经典的 TCP 握手后,连接器就要开始认证你的身份,这个时候用的就是你输入的用户名和密码。

后面就和我们登陆系统一样,如果账户密码不正确会提醒:"Access denied for user"的错误,账户密码都正确会在权限表中校验你所拥有的权限,你就可以开始操作了。

查询缓存

连接建立完成后,你就可以执行 select 语句了。执行逻辑就会来到第二步:查询缓存。

MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户端。

但是这里的要求是十分严格的,而且它并不是那么的好用,我们也要注意,MySQL 8.0 版本直接将查询缓存的整块功能删掉了,也就是说 8.0 开始彻底没有这个功能了。

这里给大家提供一个显式指定使用查询缓存的语句

select SQL_CACHE * from Team where ID=10
分析器

如果没有命中查询缓存,就要开始真正执行语句了。首先,MySQL 需要知道你要做什么,因此需要对 SQL 语句做解析。

分析器会对我们的SQL语句进行 “词法分析” ,也就是搞懂我们的SQL里面的字符串分别是什么,代表什么。

接下来还需要进行 “语法分析”,语法分析器会根据语法规则,判断你输入的这个 SQL 语句是否满足 MySQL 语法。

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 ...

当我们看到什么的报错时就需要考虑自己的SQL语句有什么问题了

优化器

经过了分析器,MySQL 就知道你要做什么了。在开始执行之前,还要先经过优化器的处理。

优化器是在表里面有多个索引的时候,决定使用哪个索引;有多个where条件的时候,先执行那个条件;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序等等。优化器会对我们的SQL语句进行优化,让它执行的更快,优化器阶段完成后,这个语句的执行方案就确定下来了,然后进入执行器阶段。

执行器

MySQL 通过分析器知道了你要做什么,通过优化器知道了该怎么做,于是就进入了执行器阶段,开始执行语句。

开始执行的时候,要先判断一下你对这个表 T 有没有执行查询的权限,如果没有,就会返回没有权限的错误,如果有权限,就打开表继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。

比如我们上面SQL中的表 Team 中,ID 字段没有索引,那么执行器的执行流程是这样的:

调用 InnoDB 引擎接口取这个表的第一行,判断 ID 值是不是 10,如果不是则跳过,如果是则将这行存在结果集中;

调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。

执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。

至此,我们就把MySQL的所有 “零件” 都介绍了完了。

在你阅读完这篇文章时不难发现,我们给的图中已经将最重要的内容精简概况了,各位观众老爷可以直接拿图即可。

======================== 再次感谢大家的观看 ========================

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zyyn_未来可期

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值