MySQL 是一款垮平台的数据库产品,在常见的操作系统(如 Linux,macOS,Windows 等等)上都能运行。但不管是运行在哪个平台上的 MySQL,它的体系结构大体都是一致的。

mysql-architecture

上图是 MySQL 数据库经典的结构示意图,主要有连接层、SQL 层和存储层。

数据库和实例

在说体系结构之前,先抛出 2 个概念:

  • 数据库(database)
    数据库是文件的集合,包括数据库文件、系统文件等等。我们平常说的 “创建一个数据库”,其实就是在操作系统中新增了一堆文件。
  • 实例(instance)
    数据库实例是应用程序,由进程和内存空间组成。在操作系统中,一个实例就是一个进程,这个进程才是真正管理数据库的。

一个实例上可以有多个数据库,一个数据库一般对应一个实例。

连接层

连接层会进行安全检查与认证、通信协议与线程处理等工作。
客户端连接 MySQL 实例时需要先认证,方式可以是用户名与密码,也可以通过 SSL 证书。
每个客户端连接对应服务器上的一个线程,一个线程对应一个逻辑 CPU。
这层包含的服务并不是 MySQL 所独有的技术,它们都是服务于 C/S 程序或者是这些程序所需要的。

SQL 层

SQL 层会对 SQL 语句进行鉴权、解析、优化、执行、缓存、返回等操作。

query-process

客户端发起查询请求后,MySQL 会检查查询缓存(在查询缓存开启的情况下),如果缓存命中,直接返回结果集。否则,就对查询进行解析,并创建一个内部数据结构(解析树),预处理器会根据规则进一步检查解析树是否合法。接着,优化器根据存储引擎将查询转化成效率最好的执行计划。最后,查询执行引擎调用存储引擎接口得出结果。
MySQL 在处理底层数据之前的所有工作都在 SQL 层完成,各个存储引擎提供的功能也在这一层,如存储过程、触发器、视图等。

存储层

存储层由一种或多种存储引擎、数据文件、日志、文件系统等部分组成,负责对 MySQL 中的数据进行存储和提取。
有别于其他的数据库产品,MySQL 的存储引擎是插件式的。这种结构提供了标准的接口,用户可以根据自己的需求安装各种已有的、甚至自己开发的的引擎。
SQL 层通过 API 与存储引擎通信,这些 API 屏蔽了不同存储引擎间的差异。
作为 MySQL DBA 应该认识到,存储引擎或者说使用最为普遍的 InnoDB 存储引擎才是 MySQL 的核心