MySQL浅析 —— 逻辑架构

MySQL是当下最受欢迎的数据库之一。在互联网时代不论BAT这样的大厂团队还是创业型中小团队都不约而同的选择了MySQL,所以在应用之余有必要了解其内部架构和内在逻辑的。

网传的这张Mysql的构架图很经典但也很复杂,不知道准备发奋拿下MySQL的小伙伴被这张图吓跑。所以我们今天换一个姿势来说说:

简化之后一下明朗了许多,搞Web的小伙伴可能会比较熟悉这种构图结构。我们把MySQL看成拆成两个逻辑域,Server域 和 存储域(Server层 和 存储引擎 )。

下面将以叙述系统功能域的方式来解析MySQL架构。

Server域(Server层 )又分为若干个服务单元,分别为 —— 连接器子域、查询缓存子域、分析器子域、优化器子域、执行器子域等。这些服务构成了MySQL的大多数核心服务功能和所有的内置函数这其中包括日期、时间、数学计算、加密函等。他们是MySQL服务的核心能力,支撑着存储过程、触发器、视图等核心功能。

Server域之外存储域(存储引擎)是最重要的支撑域。

存储域 的功相对比较清晰,就是用来存储和提取数据。但与Server域不同的是,存储域若干不同的存储引擎构成。而且各存储引擎构互为独立,以插件方式存在。常见的存储引擎有InnoDB、MyISAM、Memory 等。当下Web小伙伴最常用的的存储引擎是InnoDB,它从 MySQL5.5.5开始成被作为默认存储引擎。 

Server域中各子域的职责如下:

连接器——连接器负责跟客户端建立连接、获取权限、维持和管理连接。

查询缓存——MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。如果在缓存中,则直接返回结果。如果语句不在查询缓存中,就会继续后面的执行阶段,执行完成后,执行结果会被存入查询缓存中。

分析器——分析器先会做“词法分析,语法分析”。你输入的是由多个字符串和空格组成的一条 SQL 语句,MySQL 需要识别出里面的字符串分别是什么,代表什么。

优化器——优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。

执行器——执行器开始执行语句,将结果集返回给客户端。

作为后端工程师经常操作SQL语句,以一次select操作为例其执行步骤如下:

第一步 建立连接 你会先连过到数据库上,这时处理你的连接请求就是连接器。连接过程中你需要给出用户名和密码,证验通过后连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。此时的连接就建立完成了。

第二步 查询缓存 当有一条select查询语句请求到MySQL,会先到查询缓存中是否在之前执行过这条语句。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。key 是查询的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找到 key,那么这个value 就会被直接返回给客户端。如果语句不在查询缓存中,就会继续后面的执行阶段。执行完成后,执行结果会被存入查询缓存中。你可以看到,如果查询命中缓存,MySQL 不需要执行后面的复杂操作,就可以直接返回结果,这个效率会很高。

Web后端的同学肯定非常熟悉这种处理模式,我们经常在后端架构中使用Redis做为缓存,对于频繁使用的热点数据进行处理,意在提高IO为数据库解压从而提高系统效率。

但MySQL的缓存也不是万能的也有自己的弊端,应用上还要谨慎。之后会有文章展开讨论。

第三步 分析器 这一步是在缓存查询没有命中的情况下进行的。分析器会在这步对请求的语句做“词法分析”  (词法分析属于编辑原理范畴 ),目的是识别SQL语句中都有关键字,比如select、where、order by 等,并检查语法是否正确。

第四步 优化器 经过器分析之后,MySQL已经搞清了语句要做什么。但这并非最佳执行方案,所以MySQL还要进行优化处理。优化器的职责是按照一定原则来得到它认为的目标SQL在当前情形下最有效的执行路径和执行计划。比如,当表中有多个索引时决定使用哪个索引;语句中有多表关联时,决定各个表的连接顺序。执行逻辑的不同决定了执行效率,而这些都由优化器决定使用哪一个方案。

第五步 执行器 经过了上面的几步之后终于到了执行的时候。开始执行之时,要先判断一下对于表的权限。如果没有,则返回没有权限的错误。如果有则继续执行。打开表的时候,执行器就会根据表的引擎定义,去使用这个引擎提供的接口。

以下面的语句为例,执行流程是这样的:

select * from user where name = 'abc';

调用InnoDB引擎接口获取这个表的第一行,判断name的值是不是abc,如果不是则跳过,如果是则将这行存在结果集中。调用引擎接口获取"下一行",重复相应的判断逻辑,直到取到最后一行数据。执行器将遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。

上述就是SQL语句在Server层中的执行逻辑。更多细节下回分解。

作者|zhanyd  、责编|大笨梨

冻梨邦

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值