非常好 👍 阿杰,这一节我们深入讲解 「MySQL 架构与存储引擎」,这是理解数据库性能优化与调优的关键基础。
我们会从整体架构 → 核心组件 → 存储引擎机制 → 对比分析四个角度展开。
🧩 一、MySQL 整体架构概览
MySQL 的架构大体分为三层:
+----------------------------------------+
| 应用层(客户端) |
| JDBC / Python / PHP / Go / CLI 工具 |
+----------------------------------------+
| MySQL Server 层(核心) |
| 连接管理 | 查询解析 | 优化器 | 缓存 |
+----------------------------------------+
| 存储引擎层(可插拔) |
| InnoDB / MyISAM / Memory / CSV ... |
+----------------------------------------+
| 文件系统 / 硬件层 |
| 数据文件、日志文件、磁盘 I/O |
+----------------------------------------+
📘 要点:
- 上层是 SQL 语法解析与执行;
- 下层是物理数据的真正存取;
- MySQL 的最大特点之一:存储引擎可插拔。
⚙️ 二、MySQL Server 层(核心组件)
MySQL Server 层主要负责:连接管理、SQL 解析、查询优化、缓存、执行计划 等。
模块 | 功能说明 |
---|---|
连接管理 | 客户端连接认证(用户名、密码、权限) |
查询缓存(Query Cache) | 存储 SQL 与结果(⚠️ MySQL 8.0 已移除) |
解析器(Parser) | 将 SQL 语句解析成语法树 |
优化器(Optimizer) | 选择最优执行计划(索引、表连接方式等) |
执行器(Executor) | 调用存储引擎 API 执行 SQL 操作 |
📊 SQL 查询执行流程
举例:
SELECT name FROM student WHERE id = 1;
执行步骤如下:
1️⃣ 连接器
验证用户身份并建立会话。
2️⃣ 解析器
语法分析 → “这是一条 SELECT 查询语句”。
3️⃣ 优化器
决定使用哪个索引(如 PRIMARY KEY
)。
4️⃣ 执行器
调用存储引擎(如 InnoDB)的接口取出行数据。
5️⃣ 返回结果
将结果集返回客户端(带缓冲机制)。
🧱 三、存储引擎层(Storage Engine Layer)
存储引擎是 负责数据的物理存取、索引管理、事务控制 的模块。
MySQL 可用引擎(部分)
存储引擎 | 是否事务 | 是否支持外键 | 索引类型 | 特点 |
---|---|---|---|---|
InnoDB | ✅ 支持 | ✅ 支持 | 聚簇索引 | 默认引擎,事务安全、高并发 |
MyISAM | ❌ 不支持 | ❌ 不支持 | 非聚簇索引 | 读多写少性能好,轻量 |
Memory | ❌ 不支持 | ❌ 不支持 | 哈希索引 | 存放在内存中,速度极快 |
CSV | ❌ 不支持 | ❌ 不支持 | 无 | 数据存储为 CSV 文件,易导入导出 |
Archive | ❌ 不支持 | ❌ 不支持 | 无索引 | 适合存储归档日志,压缩率高 |
NDB (Cluster) | ✅ 支持 | ✅ 支持 | 分布式索引 | MySQL Cluster 架构专用 |
Federated | ❌ 不支持 | ❌ 不支持 | 代理 | 可访问远程 MySQL 表 |
📘 InnoDB 架构详解(重点)
InnoDB 是 MySQL 的默认引擎(自 5.5 起)。
它是 事务型存储引擎,具备 ACID 特性。
+--------------------------------------+
| InnoDB Buffer Pool (缓存池) |
+--------------------------------------+
| Undo Log / Redo Log / Doublewrite |
+--------------------------------------+
| 数据页 (Data Pages) / 索引页 (B+Tree)|
+--------------------------------------+
| 表空间(.ibd 文件) |
+--------------------------------------+
🔹 关键组件
组件 | 说明 |
---|---|
Buffer Pool | 缓存数据页与索引页,提高 I/O 性能 |
Redo Log | 记录数据修改(崩溃恢复用) |
Undo Log | 实现事务回滚与 MVCC(多版本并发控制) |
Doublewrite Buffer | 防止部分写入导致数据页损坏 |
Adaptive Hash Index | 自适应哈希索引,加速查询 |
🔍 四、InnoDB 与 MyISAM 对比
对比项 | InnoDB | MyISAM |
---|---|---|
事务支持 | ✅ | ❌ |
外键 | ✅ | ❌ |
锁机制 | 行级锁 | 表级锁 |
崩溃恢复 | 支持 | 不支持(需修复) |
缓存机制 | 数据+索引缓存 | 仅索引缓存 |
并发性能 | 高 | 一般 |
适用场景 | OLTP(频繁更新) | OLAP(读多写少) |
🧠 五、实际调优建议
场景 | 建议 |
---|---|
高并发业务系统 | 使用 InnoDB(行锁+事务) |
报表分析、只读数据 | 可用 MyISAM 或 Memory |
临时计算表 | Memory 引擎 + 定期清空 |
日志归档 | Archive 引擎 |
分布式高可用 | InnoDB + Group Replication 或 NDB Cluster |
🧰 六、查看和切换存储引擎命令
-- 查看当前数据库支持的存储引擎
SHOW ENGINES;
-- 查看某表使用的存储引擎
SHOW TABLE STATUS LIKE 'student'\G
-- 创建表时指定存储引擎
CREATE TABLE test (
id INT PRIMARY KEY,
name VARCHAR(50)
) ENGINE=MyISAM;
-- 修改存储引擎
ALTER TABLE test ENGINE=InnoDB;
📚 七、总结
层级 | 职责 | 核心组件 |
---|---|---|
Server 层 | SQL 解析、优化、执行 | 连接器、解析器、优化器、执行器 |
存储引擎层 | 数据存取、索引、事务 | InnoDB、MyISAM、Memory… |
文件系统层 | 物理存储 | 数据页、日志文件、表空间 |
🧠 一句话记忆:
MySQL Server 管理 SQL 逻辑,存储引擎管理数据物理!
发表回复