MySQL高级—体系结构简介

一、整体架构图

和其它数据库相比,MySQL 有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在 存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。这种架构可以根据业务的需求和实际需要选择合适的存储引擎。MySQL官方给出的系统逻辑架构分为4层,如下图所示:

这四层自顶向下分别是连接层,服务层(核心层),存储引擎层,系统文件层。我们自顶向下开始讲解。

1、连接层

最上层是一些客户端和连接服务,包含本地 sock 通信和大多数基于客户端/服务端工具实现的类似于 tcp/ip 的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上使用了线程池技术,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于 SSL 的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。

2、服务层

第二层服务层是MySQL的核心,MySQL的核心服务层都在这一层:查询解析,SQL执行计划分析,SQL执行计划优化,查询缓存。以及跨存储引擎的功能都在这一层实现:存储过程,触发器,视图等。重要的组件的功能如下图所示:

Management Serveices & Utilities系统管理和控制工具
SQL InterfaceSQL 接口。接受用户的 SQL 命令,并且返回用户需要查询的结果。比如select * from xxx就是调用 SQL Interface
ParserSQL解析器。 SQL 命令传递到解析器的时候会被解析器验证和解析
OptimizerSQL查询优化器。 SQL 语句在查询之前会使用查询优化器对查询进行优化,比如有where 条件时,优化器来决定先投影还是先过滤。
Cache 和 Buffer查询缓存。如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key 缓存,权限缓存等

在这一层就是SQL语句被执行的一层,接下来我们分析一下SQL语句的执行过程

(1)mysql客户端通过协议和mysql服务器连接,发送查询语句,首先会检查查询缓存(query cache),如果命中,直接返回结果,否则进行语句解析查询缓存(query cache)——它存储 SELECT 语句以及相应的查询结果集。如果某个查询结果已经位于缓存中,服务器就不会再对查询进行解析、优化、以及执行。它仅仅将缓存中的结果返回给用户即可,这将大大提高系统的性能。

(2)语法解析器和预处理:首先mysql解析器会将SQL语句根据关键字进行解析,并生成一颗"解析树"。语法解析器会根据mysql语法规则对解析树进行语法检查;预处理器则根据一些 mysql 规则进一步检查解析数是否合法

(3)当解析树被认为是合法的了,会通过查询优化器将其转化成执行计划。通常一条查询可以有很多种执行方式,最后都返回相同的结果。优化器的作用就是找到这其中最好的执行计划。

(4)在完成语法解析和优化之后,mysql会生成执行计划。查询执行引擎根据执行计划给出的指令调用存储引擎的结构得到结果。在查询到结果后除了返回给客户端外,还会将结果缓存一份到查询缓存中。

SQL语句的执行过程可以用下图表示:

3、存储引擎层

存储引擎层,存储引擎真正的负责了 MySQL 中数据的存储和提取,服务器通过 API 与存储引擎进行通信。MySQL采用插件式的存储引擎。MySQL为我们提供了许多存储引擎,每种存储引擎有不同的特点。我们可以根据不同的业务特点,选择最适合的存储引擎。如果对于存储引擎的性能不满意,可以通过修改源码来得到自己想要达到的性能。

这里需要说明的是:存储引擎是针对于表的而不是针对库的(一个库中不同表可以使用不同的存储引擎),服务器通过API与存储引擎进行通信,用来屏蔽不同存储引擎之间的差异

在MySQL中常用的存储引擎有3个:InnoDB、MyISAM以及Memory。这三种引擎就是因为很常用,所以在面试中也经常被问到,因此我们有必要详细了解一下,这里不做过多的说明,只是简单的介绍一下,详情参考

  • InnoDB:支持事物,适合OLTP应用,假设没有特殊的需求,使用InnoDB就可以满足需求。InnoDB支持行级锁,从MySQL5.5.8开始InnoDB就成为了MySQL的默认存储引擎。
  • MyISAM不支持事务,表锁设计,支持全文索引,主要应用于OLAP应用
  • Memory:数据都存放在内存中,数据重启或崩溃,表中的数据都将消失,但是表的结构还是会保存下来。默认使用Hash索引。适用于OLTP应用的临时表或中间表。
4、系统文件层

该层主要是将数据库的数据存储在文件系统之上,并完成与存储引擎的交互。

MyISAM文件格式

MyISAM在磁盘存储上有三个文件,每个文件名以表名开头,扩展名指出文件类型:

  • .frm文件:用于存储表结构的定义
  • .MYD文件:用于存放数据,可以及理解为MyISAM Data===>MYD
  • .MYI文件:用于存放表索引,可以理解为MYISAM Index===>MYI

MyISAM引擎还支持三种不同类型的存储格式:静态表、动态表、压缩表

InnoDB文件格式

InnoDB属于索引组织表,InnoDB有两种存储方式:共享表空间和独享表空间存储。两种存储方式的表结构信息和MyISAM一样,以表名开头,扩展名是.frm

.frm文件:与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等。

.ibd/.ibdata文件:存放innodb表的数据文件。

  • 独享表空间存储方式使用.ibd文件格式。
  • 共享表空间存储方式使用.ibdata存储方式,所有的表共同使用一个ibdata文件,即所有的数据文件都存在一个文件中。决定使用哪种表的存储方式可以通过mysql的配置文件中 innodb_file_per_table选项来指定。

InnoDB默认采用的是独享表空间存储数据,这种方式的好处是当数据库产生大量文件碎片的时,整理磁盘碎片对线上运行环境的影响较小

留言区

还能输入500个字符