Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > MySQL逻辑架构与存储引擎

MySQL逻辑架构与常用的存储引擎方式

作者:Bryant5051

这篇文章主要介绍了MySQL逻辑架构与常用的存储引擎方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

概述

MySQL 是我们平时开发中最常用的关系型数据库,学习 MySQL 的逻辑架构相当于从全局去理解 MySQL 的运行机制,对于 MySQL 的学习和使用都会有较大的帮助。

逻辑架构示意图

下面就是 MySQL 的逻辑架构示意图:

从宏观角度来看,MySQL 可以分为两部分:

Server 层功能模块

MySQLServer 层提供了对外暴露的所有功能,例如请求连接、认证、语法/词法分析、执行语句优化、查询缓存、内置函数、语句执行等功能。

这些功能分别由不同的功能模块提供,模块与模块之间的分工非常明确;同时,也是由这些模块的相互协作,最终给我们提供了可用的 MySQL 服务。

连接器

连接器是负责与客户端建立连接权限管理,以及管理连接的功能模块。

连接器的功能职责比较清晰,但也有些细节需要关注:

建立连接时,如果认证成功,连接器会把当前时刻的用户权限快照作为这个连接后续的权限判断逻辑的依据,直到连接断开

连接建立成功后,连接的最大空闲时间(即什么操作都不执行的时间)由 wait_timeout 参数控制,默认为 8 小时

查询缓存

查询缓存,主要用于将相同的查询语句的结果给缓存起来。查询缓存的工作原理如下所示:

既然有缓存,那么就需要考虑数据一致性的问题。MySQL 给出的解决方案就是当一个表进行了更新/新增操作后,这个表上的所有查询缓存都会失效。

这样一来,查询缓存的功能就变得非常鸡肋了。

具体的原因有:

综合来说,即在大多数场景下,查询缓存带来的性能提升效果可能比不上执行缓存操作本身带来的性能消耗,即查询缓存不值得使用。

当然,在一些几乎完全不会发生更新/新增操作的表上,这个查询缓存还是可能会起到提升性能的作用的。

MySQL 8.0 之前可以通过将 query_cache_type 改为 DEMAND,并在查询语句的查询返回字段前增加 SQL_CACHE 关键字来显示指定使用查询缓存,例如:

select SQL_CACHE * from user where id = 1;

需要注意的是,MySQL8.0 及之后的版本将查询缓存功能彻底移除了。

分析器

在客户端向服务端发送了一条 SQL 语句之后,MySQL 需要分析这条 SQL 语句是否合法;如果合法,那么这条 SQL 语句究竟是想要执行什么操作。这就是分析器的职责。

分析的过程,主要分为词法分析语法分析

词法分析:将输入的 SQL 语句中的所有单词由空格隔开的字符串)识别为不同的含义

语法分析:根据词法分析的结果以及当前配置的 SQL 执行模式(sql_mode 参数),判断这条 SQL 语句是否合法

优化器

在经过分析器的词法分析语法分析后,SQL 语句的执行流程就来到了优化器

由上面的逻辑我们可以知道,到达优化器的语句必定是一个合法的,且执行意图已知的 SQL 语句。

优化器的作用,就是尝试为 SQL 语句的执行意图,挑选出一种效率最高的执行方案

例如,在一个要执行查询语句的目标数据表中,可能存在多个索引,优化器将会根据这些索引的类型以及字段组合,结合查询语句本身的条件,为其挑选一个最优的索引,以便用于后续真正的数据查询。

又或者,在一个有多表关联的查询语句中,根据表连接的字段以及各表的数据量,决定表与表之间的连接顺序以及使用的算法。

优化器的工作结束后,这条语句的执行方案就确定下来了。值得一提的是,我们使用 explain 关键字用于分析一条 SQL 语句的执行计划时,返回的正是优化器的一部分分析结果。

执行器

MySQL 通过分析器已经知道了 SQL 语句的执行意图,并且通过优化器已经为这条 SQL 语句挑选除了一种效率最高的执行方案,那么 SQL 语句的执行流程将会来到执行器

执行器的主要工作为:

首先查看当前用户是否具有 SQL 语句中的目标表的对应操作权限

如果有权限,那么将会调用当前使用的存储引擎的对应操作接口,执行这条 SQL 语句真正的执行意图

存储引擎层

存储引擎层负责真正的数据存储和提取,其结构(对于 Server 层来说)是插件式的,封装了具体的存储引擎的操作逻辑。

存储引擎的服务对象是表。意思就是说,不同的表可以使用不同的存储引擎;同一个数据库中的不同表也可能使用不同的存储引擎。

下面将介绍常用的两个存储引擎:InnoDBMyISAM

InnoDB

InnoDBMySQL 5.5 版本后的默认存储引擎,也是日常开发过程中使用的最多的存储引擎。

使用 InnoDB 作为引擎来存储的表, 会对应磁盘上的两个文件:

InnoDB 主要特性

InnoDB 的主要特性如下所示:

InnoDB 引擎下的查询过程

在使用了 InnoDB 引擎的表的单表查询语句的执行过程将会是这样:

首先看查询条件中是否使用了聚集索引

如果不是聚集索引,则看查询条件中是否命中的二级索引(非聚集索引)

如果二级索引也不能命中,则直接在聚集索引树中遍历所有叶子节点,待全表扫描完后,再将中途查找到的符合条件的所有数据返回,时间复杂度为 O(N)

MyISAM

MyISAMMySQL 最早出现的一批存储引擎之一,但是现在在日常开发过程中已经比较少用。 

MyISAM 也有很多优点,但是有一个致命的缺点:不支持事务,没有 crash safe 能力。

使用 MyISAM 作为引擎来存储的表, 会对应磁盘上的三个文件:

MyISAM 的主要特性

MyISAM 的主要特性如下所示:

MyISAM 引擎下的查询过程

在使用了 MyISAM 引擎的表的单表查询语句的执行过程将会是这样:

首先看查询条件中,是否有可以命中的索引

InnoDB 和 MyISAM 的对比

InnoDBMyISAM 的主要区别有:

对表的行数查询的支持不同:

MyISAM 不支持外键,InnoDB 支持外键

delete from table 的处理方式不一样:

文件存储方式不同:

总的来说,在不考虑数据一致性以及数据安全性,且查询操作远多于更新操作的场景下,可以考虑选择 MyISAM 作为存储引擎;否则都应该选择 Innodb 引擎

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文