MySQL是一种广泛使用的关系型数据库管理系统(RDBMS),其体系结构设计旨在提供高效的数据存储、查询处理和事务管理。MySQL的体系结构可以分为多个层次,每个层次负责不同的功能模块。
MySQL的体系结构主要由以下几个部分组成:(自上而下)
- 连接层
- SQL层
- 存储引擎层
- 文件系统层
体系结构示例:
1、连接层
连接层是MySQL服务器与客户端之间的桥梁,负责处理客户端的连接请求、身份验证、权限检查以及连接池管理等。
客户端连接器(Client Connectors):
提供与MySQL服务器建立连接的支持。目前几乎支持所有主流的服务器编程技术,例如常见的Java、C、Python、.NET等,它们通过各自的API技术与MySQL建立连接。
2、SQL层(或服务层)
SQL层是MySQL的核心部分,也称服务层(MySQL Server)。负责解析SQL查询、优化查询、执行查询操作并将结果返回给客户端。
SQL层的主要组件包括:
(1)、连接池(Connection Pool):MySQL提供了内置的连接池功能(从8.0版本开始),用于管理多个客户端连接。连接池可以减少频繁创建和销毁连接的开销,提升系统的并发处理能力。
(2)、系统管理和控制工具(Management Services & Utilities):用于备份恢复、安全管理、集群 管理等 。
(3)、SQL接口(SQL Interface):用于接收客户端发送的各种SQL命令,并且返回用户需要查询的结果。比如DML、DDL、存储过程、视图、触发器等。
(4)、解析器(Parser):解析器负责将SQL语句转换为内部的语法树结构。它会检查语法是否正确,并生成相应的执行计划。
(5)、查询优化器(Query Optimizer):查询优化器是SQL层的核心组件之一,负责选择最优的查询执行计划。优化器会根据表的统计信息(如索引、表大小、数据分布等)评估不同的执行路径,并选择最高效的方案。优化器的目标是减少I/O操作、降低CPU使用率,从而提高查询性能。
(6)、执行器(Executor):执行器根据优化器生成的执行计划,调用存储引擎层的接口来实际执行查询操作。执行器负责处理各种SQL操作,如SELECT、INSERT、UPDATE、DELETE等。
(7)、缓存(Cache&Buffer):缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,权限缓存,引擎缓存,索引缓存等。如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据,用于加速数据读取操作。注意:MySQL曾经提供了一个查询缓存功能(在8.0版本中已被移除),用于缓存查询结果。如果相同的查询再次执行,MySQL可以直接从缓存中返回结果,而不需要重新执行查询。虽然查询缓存可以提高某些场景下的性能,但在高并发写入的情况下,它的效果可能适得其反,因此在现代版本中已被移除。
3、存储引擎层(Pluggable Storage Engines)
存储引擎层是MySQL的关键组成部分,负责实际数据的存储与提取,与底层系统文件进行交互。MySQL支持多种存储引擎,每种存储引擎都有其独特的特性和适用场景。现在有很多种存储引擎,各有各的特点,最常见的是MyISAM和InnoDB。
常见的存储引擎包括:
(1)、InnoDB:默认存储引擎,支持事务、外键约束、行级锁和崩溃恢复。InnoDB是大多数生产环境的首选,特别适用于需要高并发写入和事务安全的场景。
(2)、MyISAM:早期MySQL的默认存储引擎,不支持事务和行级锁,但具有较高的读取性能。MyISAM适合只读或读多写少的场景,但由于其缺乏事务支持,现在已较少使用。
(3)、Memory:将数据存储在内存中,适用于临时表或需要快速读写的场景。由于数据存储在内存中,重启后数据会丢失,因此不适合持久化存储。
(4)、NDB Cluster:用于分布式集群的存储引擎,支持高可用性和水平扩展。NDB Cluster通过分片技术将数据分布在多个节点上,适合需要处理大规模数据集和高并发访问的场景。
(5)、Archive:专门用于归档数据的存储引擎,适合存储大量历史数据。Archive引擎压缩数据,节省存储空间,但写入性能较低,适合只写或很少读取的场景。
(6)、CSV:将数据存储为CSV文件格式,适合与外部应用程序进行数据交换。CSV引擎不支持索引和复杂的查询操作,主要用于数据导入和导出。
4、文件存储层
该层负责将数据库的数据和日志存储在文件磁盘上,并完成与存储引擎的交互,是文件的物理存储层。主要包含日志文件,数据文件,配置文件,pid文件,socket文件等。
不同存储引擎对文件系统的使用方式有所不同:
(1)、InnoDB
InnoDB使用独立的表空间文件(.ibd)来存储每个表的数据和索引。此外,InnoDB 还维护一个共享表空间文件(ibdata1),用于存储系统表、回滚段、双写缓冲区等元数据。InnoDB还有独立的重做日志文件(redo log)和撤销日志文件(undo log),用于实现事务的持久性和崩溃恢复。
(2)、MyISAM
MyISAM使用三个文件来存储每个表的数据:
- .frm文件:存储表的元数据(如表结构、字段定义等)。
- .MYD文件:存储表的数据。
- .MYI文件:存储表的索引。
其他相关文件说明:
db.opt文件:记录这个库的默认使用的字符集和校验规则。
ibdata1文件:系统表空间数据文件,存储表元数据、Undo日志等 。
ib_logfile0、ib_logfile1 文件:Redo log日志文件。
pid文件:pid文件是mysqld应用程序在Unix/Linux环境下的一个进程文件,和许多其他 Unix/Linux服务端程序一样,它存放着自己的进程id。
socket文件:socket文件也是在Unix/Linux环境下才有的,用户在Unix/Linux环境下客户端连接可以不通过TCP/IP网络而直接使用Unix Socket来连接MySQL。
乘风破浪会有时,直挂云帆济沧海!!!