简述
MySQL 虽然以简单著称,但其内部结构并不简单。
MySQL 是一个典型的 C/S
架构程序,MySQL Server
提供数据库服务,完成客户端的请求和操作,Client
负责连接到 Server
。MySQL 和其他关系型数据库不一样的地方在于它的弹性以及可以通过插件形式提供不同种类的存储引擎,MySQL请求处理过程会根据不同的存储引擎发生变化,比如事务性的InnoDB和非事务性的MyISAM,数据的存储和SQL的执行会产生很大的差异。
MySQL 由连接池、SQL 接口、解析器、优化器、缓存、存储引擎等组成,可以分为三层,即,MySQL Server层、存储引擎层和文件系统层(存储层)。MySQL Server 层又包括连接层和 SQL 层(服务层)。
上图中,连接池(Connection pool)为连接层,系统管理及控制工具(Management Services & Utilities
)、...、缓存(Caches & Buffers
)等为 SQL 层,可插拔存储引擎(Pluggable Storage Engines
)为存储引擎层,系统文件(File system
)、文件和日志(Files & Logs
)为文件系统层。
客户端连接器(Connectors)不属于以上任何一层,可以将 客户端连接器 理解为各种客户端、应用服务,主要指的是不同语言与 SQL 的交互。
MySQL Server 层
连接层
应用程序通过接口(如:ODBC
、JDBC
)来连接 MySQL,最先连接处理的是连接层。连接层包括通信协议、线程处理、用户名密码认证 三大部分。
- 通信协议:负责检测客户端版本是否兼容 MySQL 服务端。
- 线程处理:指每一个连接请求都会分配一个对应的线程,相当于一条 SQL 对应一个线程,一个线程对应一个逻辑 CPU,在多个逻辑 CPU 之间进行切换。
- 密码认证:用来验证用户创建的账号、密码,以及 host 主机授权是否可以连接到 MySQL 服务器。
Connection Pool
(连接池)属于连接层。由于每次建立连接都需要消耗很多时间,连接池的作用就是将用户连接、用户名、密码、权限校验、线程处理等需要缓存的需求缓存下来,下次可以直接用已经建立好的连接,提升服务器性能。
SQL 层(服务层)
SQL 层是 MySQL 的核心,MySQL 的核心服务都是在这层实现的。主要包含权限判断、查询缓存、解析器、预处理、查询优化器、缓存和执行计划。
- 权限判断:可以审核用户有没有访问某个库、某个表,或者表里某行数据的权限。
- 查询缓存:通过
Query Cache
进行操作,如果数据在 Query Cache 中,则直接返回结果给客户端,不必再进行查询解析、优化和执行等过程。 - 查询解析器:针对 SQL 语句进行解析,判断语法是否正确。
- 预处理器:对解析器无法解析的语义进行处理。
- 查询优化器:对 SQL 进行改写和相应的优化,并生成最优的执行计划,就可以调用程序的 API 接口,通过存储引擎层访问数据。
系统管理及控制工具(Management Services & Utilities
)、SQL接口(SQL Interface
)、解析器(Parser
)、优化器(Optimizer
)、缓存(Caches & Buffers
)都属于 SQL 层,详细说明如下表所示。
名称 | 说明 |
Management Services & Utilities | MySQL 的系统管理和控制工具,包括备份恢复、MySQL 复制、集群等。 |
SQL Interface(SQL 接口) | 用来接收用户的 SQL 命令,返回用户需要查询的结果。例如 SELECT FROM 就是调用 SQL Interface。 |
Parser(查询解析器) | 在 SQL 命令传递到解析器的时候会被解析器验证和解析为以便 MySQL 优化器可以识别的数据结构 或者 返回 SQL 语句的错误。 |
Optimizer(查询优化器) | SQL 语句在查询之前会使用查询优化器对查询进行优化,同时验证用户是否有权限进行查询,缓存中是否有可用的最新数据。它使用“选取-投影-连接”策略进行查询。 例如 SELECT id, name FROM student WHERE gender = "女"; 语句中,SELECT 查询先根据 WHERE 语句进行选取,而不是将表全部查询出来以后再进行 gender 过滤。SELECT 查询先根据 id 和 name 进行属性投影,而不是将属性全部取出以后再进行过滤,最后,将这两个查询条件连接起来生成最终查询结果。 |
Caches & Buffers(查询缓存) | 如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的,比如表缓存、记录缓存、key 缓存、权限缓存等。 |
存储引擎层(Pluggable Storage Engines)
存储引擎层是 MySQL 数据库区别于其他数据库最核心的一点,也是 MySQL 最具特色的一个地方。
MySQL区别于其他数据库的最重要特点是其插件式的表存储引擎。他根据MySQL AB公司提供的文件访问层抽象接口来定制一种文件访问的机制(该机制叫存储引擎)。
存储引擎是MySQL中具体与文件打交道的子系统,主要负责 MySQL 中数据的存储和提取。
MySQL 支持的存储引擎如下所示:
因为在关系数据库中,数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)。
文件系统和日志层
文件系统和日志层主要包括 MySQL 中存储数据的底层文件,与上层的存储引擎进行交互,是文件的物理存储层。其存储的文件主要有:配置文件、数据文件、日志文件、MySQL的pid进程文件和socket套接字文件等。
其中,日志文件主要有redo log(重做日志)、undo log(回滚日志)、binlog(归档日志)等。不同的存储引擎存储的日志有所不同。
总结
本文大致介绍了 MySQL 体系结构,其中包括连接层和 SQL 层(服务层),存储引擎层、文件系统和日志层。