MySQL 架构与存储引擎
mediumMySQL架构InnoDBMyISAM存储引擎
MySQL 整体架构
客户端(Java/Python/命令行)
│
▼
┌─────────────────────────────────────┐
│ 连接器 (Connector) │ ← 身份验证、连接管理
├─────────────────────────────────────┤
│ 查询缓存 (8.0 已移除) │ ← 命中缓存直接返回
├─────────────────────────────────────┤
│ 解析器 (Parser) │ ← 语法分析、构建语法树
├─────────────────────────────────────┤
│ 优化器 (Optimizer) │ ← 选择执行计划、选择索引
├─────────────────────────────────────┤
│ 执行器 (Executor) │ ← 调用存储引擎接口执行
├─────────────────────────────────────┤
│ 存储引擎层(插件式) │
│ ┌──────┐ ┌──────┐ ┌────────┐ │
│ │InnoDB│ │MyISAM│ │Memory │ │
│ └──────┘ └──────┘ └────────┘ │
└─────────────────────────────────────┘
MySQL 采用插件式存储引擎架构,Server 层(连接器到执行器)处理所有跨引擎的功能(SQL解析、优化、权限等),存储引擎层负责数据的存储和读取。
InnoDB vs MyISAM
| 特性 | InnoDB | MyISAM |
|---|---|---|
| 事务支持 | ✅ ACID 事务 | ❌ 不支持 |
| 锁粒度 | 行级锁 | 表级锁 |
| 外键 | ✅ 支持 | ❌ 不支持 |
| MVCC | ✅ 支持 | ❌ 不支持 |
| 崩溃恢复 | ✅ redo log 保证 | ❌ 无法安全恢复 |
| 索引类型 | 聚簇索引 | 非聚簇索引 |
| 全文索引 | ✅ (5.6+) | ✅ |
| 缓存 | 数据和索引都缓存 | 只缓存索引 |
| 存储文件 | .ibd (数据+索引) |
.MYD(数据) + .MYI(索引) |
| 适用场景 | 绝大多数场景(默认引擎) | 只读/读多写少 |
InnoDB 是 MySQL 5.5+ 的默认存储引擎,几乎所有生产环境都应使用 InnoDB。
InnoDB 的核心特性
- 聚簇索引:数据按照主键顺序组织存储,主键索引的叶子节点就是数据行
- MVCC:通过多版本并发控制实现读写不冲突
- redo log:Write-Ahead Logging 保证事务持久性和崩溃恢复
- Buffer Pool:在内存中缓存数据页,减少磁盘 I/O
InnoDB Buffer Pool
Buffer Pool(内存)
┌──────────────────────────────────────┐
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐│
│ │数据页│ │数据页│ │索引页│ │undo页││
│ │(热) │ │(冷) │ │ │ │ ││
│ └──────┘ └──────┘ └──────┘ └──────┘│
│ LRU 链表管理(冷热分离) │
└──────────────────────────────────────┘
│ 读取 │ 刷脏
▼ ▼
┌──────────────────────────────────────┐
│ 磁盘 (.ibd 文件) │
└──────────────────────────────────────┘
Buffer Pool 使用改进的 LRU 算法(冷热分离),防止全表扫描一次性淘汰所有热数据页。
一条 SQL 的执行过程
SELECT * FROM users WHERE id = 1;
1. 连接器: 验证用户身份和权限
2. 解析器: 语法分析 → 生成语法树
- 识别: SELECT 语句,FROM users 表,WHERE id=1
3. 优化器: 选择执行计划
- id 是主键 → 使用主键索引直接查找
4. 执行器: 调用 InnoDB 引擎接口
- 先查 Buffer Pool(内存)
- 未命中则从磁盘加载数据页到 Buffer Pool
- 返回 id=1 的数据行
生产高频题
InnoDB 和 MyISAM 的区别?
核心区别:InnoDB 支持事务(ACID)、行级锁、MVCC、外键、崩溃恢复;MyISAM 不支持事务,只有表级锁。InnoDB 使用聚簇索引(数据和主键索引在一起),MyISAM 使用非聚簇索引(数据和索引分开存储)。
为什么 InnoDB 是默认引擎?
因为 InnoDB 支持事务和行级锁,在高并发写入场景下性能远优于 MyISAM(表级锁会导致写操作串行化)。同时 redo log 保证了崩溃恢复能力,数据安全性更高。