MySQL 存储引擎 对比(InnoDB vs MyISAM vs Memory)
1. 基础特性
| 特性 | InnoDB | MyISAM | Memory |
|---|---|---|---|
| 事务支持 | ✅ 完整 ACID 支持(Redo/Undo/两阶段提交) | ❌ 不支持 | ❌ 不支持 |
| 存储介质 | 磁盘(页式存储) | 磁盘(表级数据文件 + 索引文件) | 内存 |
| 锁机制 | 行级锁(支持 MVCC,多版本并发控制) | 表级锁(读写互斥) | 表级锁 |
| 崩溃恢复 | ✅ 支持,基于 Redo/Undo 日志 | ❌ 崩溃后容易丢失数据 | ❌ 数据随进程终止丢失 |
| 外键约束 | ✅ 支持 | ❌ 不支持 | ❌ 不支持 |
| 全文索引 | ✅(MySQL 5.6+) | ✅ | ❌ |
| 空间索引 (GIS) | ✅(MySQL 5.7+) | ✅ | ❌ |
| 数据持久化 | ✅ 磁盘 | ✅ 磁盘 | ❌ 内存(可选择磁盘临时存储) |
2. 存储模型 & 文件结构
-
InnoDB
- 数据以 页(16KB 默认) 为单位存储。
- 表和索引存储在 共享表空间(ibdata)或独立表空间(.ibd 文件)。
- 聚簇索引(Clustered Index):主键索引即数据本身,辅助索引存储主键引用。
-
MyISAM
- 数据文件
.MYD与索引文件.MYI分离。 - 非聚簇索引(索引与数据物理分离),索引叶子节点存放数据地址。
- 适合顺序扫描与只读型业务。
- 数据文件
-
Memory
- 数据存放在内存中,结构由 哈希索引 或 BTREE 索引 支持。
- 数据随 MySQL 进程关闭而消失(除非复制到磁盘临时文件)。
3. 索引实现
| 特性 | InnoDB | MyISAM | Memory |
|---|---|---|---|
| 主键索引 | 聚簇索引(主键即数据) | 非聚簇(索引指向数据文件地址) | 可选 HASH / BTREE |
| 辅助索引 | 存储主键作为二级索引指针 | 存储物理地址 | 存储行指针 |
| 全文索引 | 支持(5.6+) | 支持 | 不支持 |
| 空间索引 | 支持(R-Tree,5.7+) | 支持 | 不支持 |
4. 缓存机制
-
InnoDB
- Buffer Pool:缓存数据页、索引页、Undo 页。
- Adaptive Hash Index (AHI):热数据自适应建立哈希索引。
- Redo Log Buffer:持久化前写入。
-
MyISAM
- Key Cache:仅缓存索引,不缓存数据。
- 数据访问依赖操作系统文件缓存(Page Cache)。
-
Memory
- 所有数据在内存中,直接访问,无需磁盘 I/O。
- 速度极快,但数据不持久。
5. 并发控制与锁机制
-
InnoDB
- 行级锁,支持 MVCC(多版本并发控制)。
- 事务隔离级别:READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ(默认)、SERIALIZABLE。
- 支持 死锁检测与回滚。
-
MyISAM
- 表级锁,写时锁表,读写互斥。
- 并发性能差,适合读多写少场景。
-
Memory
- 表级锁,类似 MyISAM。
- 高速,但写操作竞争严重。
6. 崩溃恢复
-
InnoDB
- WAL(Write Ahead Logging)机制:先写 Redo Log,再写数据文件。
- 崩溃后通过 Redo + Undo 恢复一致性。
-
MyISAM
- 仅保存数据文件和索引文件,无日志。
- 崩溃可能导致索引损坏,需
myisamchk修复。
-
Memory
- 崩溃即数据丢失,仅保留表结构。
7. 适用场景
-
InnoDB
- 高并发、需要事务保障的 OLTP 系统(如电商、金融)。
- 大部分 MySQL 应用首选。
-
MyISAM
- 读多写少的 OLAP、报表、全文搜索。
- 对事务要求不高但读性能优先。
-
Memory
- 高速缓存表、中间计算结果存储。
- 临时表或会话级缓存。
8. 总结类比
- InnoDB = 企业级数据库核心(事务安全 + 并发高 + 数据完整性强)。
- MyISAM = 只读型/分析型利器(快速查询,但写和恢复弱)。
- Memory = 内存级缓存引擎(极致速度,但无持久性)。
![在这里插入图片描述]()
本文来自博客园,作者:NeoLshu,转载请注明原文链接:https://www.cnblogs.com/neolshu/p/19120613


浙公网安备 33010602011771号