1.1 MySQL 系统架构
理解 MySQL,首先要理清它的宏观定位与结构。很多人混淆了“数据库”和“数据库实例”的概念,在 MySQL 中,这两个词有着严格的物理与逻辑区分。
一、 数据库与实例的本质差异
MySQL 是一个单进程多线程架构的数据库系统。我们需要区分以下两个概念:
- 数据库 (Database):它是物理上的集合,表现为磁盘上的文件(例如以
.MYD、.MYI、.ibd结尾的文件)。这里是数据真正安家落户的地方。 - 实例 (Instance):它是操作系统中的一个运行进程。由后台线程以及一个共享内存池组成。实例的作用是用来真正操作和管理上述的数据库文件。
关系图景:当你启动 MySQL 时,实际上是启动了一个“实例”(进程),由这个实例去读取和操作物理磁盘上的“数据库”(文件)。
二、 MySQL 基础架构全景
MySQL 的系统架构采用了分层的设计思想,最大的特点就是存储引擎是可插拔的。整个架构大致可分为以下几层组件:
- 连接池 (Connection Pool):负责管理与客户端的连接,进行权限认证和连接限制。
- 解析器 (Parser):接收 SQL 语句并进行词法和语法分析,生成解析树。
- 优化器 (Optimizer):这是重中之重,它负责寻找并决定 SQL 执行的最优方案(例如选择哪个索引)。
- 执行器 (Executor):调用底层存储引擎的 API 来完成具体的数据读写操作。
- 存储引擎层 (Storage Engine):真正负责数据的存储和提取。
引擎的宿主与组件
| 维度 | MySQL 实例 (Instance) | InnoDB 存储引擎 (Engine) |
|---|---|---|
| 本质 | 操作系统中的一个进程 | 数据库的存取技术实现 |
| 组成 | 连接池 + 解析器 + 优化器 + 存储引擎 | 缓冲池 + 后台线程 + 事务日志 |
| 关系 | 容器(它是引擎的宿主) | 组件(它是实例的灵魂) |
| 灵活性 | 相对固定 | 可插拔,可以随时换一台 |
这种“可插拔”的设计意味着,你可以根据表的需求,为不同的表选择不同的存储引擎以达到最佳效果(虽然如今绝大多数场景下 InnoDB 已经是毫无争议的默认选择)。
三、 MyISAM 与 InnoDB 的本质区别
在 MySQL 5.5 版本之前,默认引擎是 MyISAM;但在 5.5 及以后,InnoDB 借由其强大的灾备和并发控制能力,成为了公认的默认选型。理解它们的区别,是理解数据库演进的关键:
| 特性 | MyISAM | InnoDB | 核心影响 |
|---|---|---|---|
| 事务支持 | ❌ 不支持 | ✅ 支持 | InnoDB 可以保证数据操作的原子性和一致性(ACID)。 |
| 锁机制 | 表锁 | 行锁 | InnoDB 的并发写入能力远超 MyISAM(由于锁颗粒度极小)。 |
| 外键支持 | ❌ 不支持 | ✅ 支持 | 只有 InnoDB 能强制维护表间的数据完整性约束。 |
| 崩溃恢复 | ❌ 不支持 | ✅ 支持 | InnoDB 依靠 WAL 及重做日志 (Redo Log) ,在断电重启后能自动从灾难中恢复,不丢数据。 |
| MVCC | ❌ 不支持 | ✅ 支持 | InnoDB 支持多版本并发控制,做到“读写不互斥”。 |
| 索引结构 | 数据和索引分离 | 索引即数据 | InnoDB 采用聚簇索引结构,主键查找直接拿到数据。 |
总结:MyISAM 只适合极少数只要查询、极少修改且不关心数据丢失安全性的场景;而 InnoDB 才是现代企业级常规业务的基础设施。