MySQL体系架构

        由上至下,我们可以MySQL的体系构架划分为:

        1. 网络接入层

        2. 服务层

        3. 存储引擎层

        4. 文件系统层

        如下官网的MySQL体系架构图所示:

mysql架构层次 mysql的架构体系_数据库

网络接入层

        提供了应用程序接入MySQL服务的接口。客户端与服务端建立连接,客户端发送SQL到服务端。

服务层

  管理工具和服务

        系统管理和控制工具,例如备份恢复、Mysql复制、集群等

  连接池

        主要负责连接管理、授权认证、安全等等。每个客户端连接都对应着服务器上的一个线程。服务器上维护了一个线程池,避免为每个连接都创建销毁一个线程。当客户端连接到MySQL服务器时,服务器对其进行认证。可以通过用户名与密码认证,也可以通过SSL证书进行认证。登录认证后,服务器还会验证客户端是否有执行某个查询的操作权限。

        由于每次建立连接需要消耗很多时间,连接池的作用就是将这些连接缓存下来,下次可以直接用已经建立好的连接,提升服务器性能。

  SQL接口

        接受用户的SQL命令,并且返回用户操作的结果。

  查询解析器

        SQL命令传递到解析器的时候会被解析器验证和解析。

        MySQL是一个DBMS(数据库管理系统),没法直接理解SQL语句。Parser负责对SQL语句进行解析好让DBMS知道该怎么做。

  查询优化器

        SQL语句在查询之前会使用查询优化器对查询进行优化。它使用的是“选取-投影-联接”策略进行查询以此选择一个最优的查询路径。

select uid,name from user where gender = 1;

        select 查询先根据 where 语句进行选取,而不是先将表全部查询出来以后再进行条件过滤。select查询先根据 uid 和 name 进行属性投影,而不是将属性全部取出以后再进行过滤将这两个查询条件联接起来生成最终查询结果

  缓存(8.0版本之前支持查询缓存,8.0之后不支持了)

        查询缓存,如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。通过LRU算法将数据的冷端溢出,未来得及时刷新到磁盘的数据页,叫脏页。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等

存储引擎层:

        负责数据的存储和读取,与数据库文件打交道。 服务器中的查询执行引擎通过API与存储引擎进行通信,通过接口屏蔽了不同存储引擎之间的差异。

        MySQL采用插件式的存储引擎。MySQL为我们提供了许多存储引擎,每种存储引擎有不同的特点。我们可以根据不同的业务特点,选择最适合的存储引擎。

        MySQL区别于其他数据库的最重要的一个特点就是插件式的表存储引擎,注意:存储引擎是基于表的。

系统文件层:

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

        存储引擎是基于表的,以下分别使用MyISAM和InnoDB存储引擎建立两张表,看看其在文件系统中对应的文件存储格式。

mysql架构层次 mysql的架构体系_MySQL_02

        存储引擎为MyISAM:

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

                *.MYD:MyISAM DATA,用于存储MyISAM表的数据

                *.MYI:MyISAM INDEX,用于存储MyISAM表的索引相关信息

        存储引擎为InnoDB:

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

                *.ibd:InnoDB DATA,表数据和索引的文件。该表的索引(B+树)的每个非叶子节点存储索引,叶子节点存储索引和索引对应的数据

        除了.ibd文件InnoDB还有一种文件的存储格式为.ibdata文件,那么他们之间有什么区别呢?        

        InnoDB的数据存储方式能够通过配置来决定是使用共享表空间存放存储数据,还是用独享表空间存放存储数据。独享表空间存储方式使用.ibd文件,并且每个表为一个ibd文件。共享表空间存储方式采用.ibdata文件,所有的表共同使用一个ibdata文件,即所有的数据文件都存在一个文件中。决定使用哪种表的存储方式可以通过mysql的配置文件中innodb_file_per_table选项来指定。

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