架构图
上图来自官方文档dev.mysql.com/doc/refman/… 是mysql8.0的体系结构图
-
MySQL Connectors (Application) 提供多种编程语言的接口,允许应用程序连接MySQL服务器
.NET、ODBC:通用数据库连接接口(如Windows平台)。JDBC:Java应用的数据库驱动。Node.js、Python、C++、C、PHP、Perl、Ruby:各语言专属的MySQL客户端库。
-
MySQL Shell (Scripting) 交互式工具,支持SQL和NoSQL操作,提供脚本化运维能力
- 执行JavaScript/Python脚本管理数据库(如部署InnoDB Cluster)。
- 直接操作文档存储(NoSQL CRUD)
-
NoSQL Interface (CRUD Operations) 处理基于X Protocol的文档操作(增删改查),类似MongoDB API
-
SQL Interface (DML, DDL, Stored Procedures, Views, Triggers) 处理传统SQL操作,包括:
- DML:
SELECT、INSERT、UPDATE、DELETE。 - DDL:
CREATE TABLE、ALTER INDEX等表结构操作。 - 存储过程/视图/触发器:封装业务逻辑,简化复杂操作。
- DML:
-
Parser (Query Translation & Object Privilege) 解析与权限控制
- 语法解析:将SQL语句转换为抽象语法树(AST)。
- 语义检查:验证表、列是否存在。
- 权限验证:检查用户是否有执行权限(如
GRANT SELECT ON db.table TO user)。
-
Optimizer (Query Path, Statistics) 查询优化
- 生成执行计划:选择成本最低的查询路径(如使用索引或全表扫描)。
- 统计信息:基于
INFORMATION_SCHEMA中的表统计信息(如行数、索引基数)。
-
Caches & Buffers (Global and Storage Engine Caches) 缓存与缓冲
- 查询缓存(MySQL 8.0已弃用):缓存完整查询结果。
- 表元数据缓存:缓存表结构信息。
存储引擎
- InnoDB:这是 MySQL 8.0 中的默认存储引擎。InnoDB 是一款适用于 MySQL 的事务安全(符合 ACID 规范)的存储引擎,具备提交、回滚和故障恢复功能,能够保护用户数据。InnoDB 支持行级锁定(不会升级为更粗粒度的锁)以及类似于 Oracle 的一致非锁定读取,这能提高多用户并发性和性能。InnoDB 将用户数据存储在聚集索引中,以减少基于主键的常见查询的 I/O 操作。为了维护数据完整性,InnoDB 还支持外键参照完整性约束。。
- MyISAM:这些表占用的空间较小。表级别的锁定会限制读/写工作负载下的性能,因此它通常用于 Web 和数据仓库配置中的只读或以读为主的场景。
- Memory:将所有数据存储在随机存取存储器(RAM)中,以便在需要快速查找非关键数据的环境中实现快速访问。此引擎以前被称为“堆”引擎。其应用案例正在减少;InnoDB 通过其缓冲池内存区域提供了一种通用且持久的方式来将大部分或全部数据存储在内存中,而 NDBCLUSTER 则为庞大的分布式数据集提供了快速的键值查找功能。
- CSV:其表格实际上就是以逗号分隔值形式存在的文本文件。CSV 表格允许您以 CSV 格式导入或导出数据,以便与能够读取和写入相同格式的数据的脚本和应用程序进行数据交换。由于 CSV 表格不进行索引,所以在正常运行期间,您通常会将数据保存在 InnoDB 表中,而在导入或导出阶段则仅使用 CSV 表格。
- Archive:这些紧凑且未进行索引的表格主要用于存储和检索大量很少被引用的历史、存档或安全审计信息。
- Blackhole:该存储引擎仅接收数据但不保存数据,其功能类似于 Unix 系统中的 /dev/null 设备。查询操作始终会返回一个空结果集。在复制配置中,这些表可用于将 DML 语句发送至从属服务器,而源服务器则不会保存自身的数据副本。
- NDB(也称为 NDBCLUSTER):这种集群式数据库引擎特别适用于那些对系统运行时间和可用性有极高标准要求的应用程序。
- Merge:使 MySQL 数据管理员或开发人员能够将一系列完全相同的 MyISAM 表进行逻辑分组,并将其作为一个整体进行引用。适用于大型数据库环境,如数据仓库。
- Federated:能够将独立的 MySQL 服务器连接起来,从而从多个物理服务器中创建一个逻辑数据库。非常适合分布式或数据集市环境。
- Example:此引擎是 MySQL 源代码中的一个示例,它展示了如何开始编写新的存储引擎。它主要对开发人员有参考价值。该存储引擎是一个“空壳”,没有任何功能。您可以使用此引擎创建表,但其中无法存储数据,也无法从中检索数据。