存储引擎是什么
存储引擎是 MySQL 中负责数据的存储、读取、管理以及索引、事务、锁等功能的底层软件组件。
简单理解:存储引擎决定了数据在硬盘或内存中"怎么存、怎么查、怎么维护"。
核心特点:
-
插件式架构:MySQL 支持多种存储引擎,可以在表级别指定(一个数据库中不同表可以用不同引擎)。
-
默认引擎:MySQL 5.5 之前是 MyISAM,之后是 InnoDB。
InnoDB
InnoDB 引擎提供了对数据库 ACID 事务的支持,并且还提供了行级锁和外键的约束。它的设计目标就是处理大数据容量的数据库系统。
可以理解为:"一个带事务、高并发、崩溃恢复能力的数据库操作系统"。MySQL 5.5以后默认引擎。
它内部包含:
- 内存管理
- 日志系统
- 锁系统
- 崩溃恢复
- 页管理
- B+树索引
- MVCC
InnoDB 本质:
内存(Buffer Pool)
+
日志系统(redo/undo)
+
B+树
+
锁系统
+
MVCC
InnoDB整体架构
客户端SQL
↓
SQL解析
↓
执行器
↓
InnoDB
│
├── Buffer Pool(内存缓存)
├── redo log(重做日志)
├── undo log(回滚日志)
├── change buffer
├── double write
├── lock system
└── flush刷盘
↓
磁盘.ibd文件
MyISAM 引擎
原本 MySQL 的默认引擎,不提供事务的支持,也不支持行级锁和外键。现在基本淘汰。
最大问题是只有表锁
UPDATE user SET name='A' WHERE id=1,直接锁整张表,并发很差。
不支持事务
sql
-- 示例:
BEGIN;
UPDATE A;
UPDATE B;
ROLLBACK;
MyISAM 会忽略
BEGIN、COMMIT、ROLLBACK、SAVEPOINT等事务相关语句(不会报错,也不会开启事务)。
BEGIN在 MyISAM 中不会生效。UPDATE A;执行后,立刻、永久修改磁盘上的数据。- 没有事务日志(
undo log),所以改完就改完了,无法撤销。 UPDATE B;同样,执行完后立即持久化。ROLLBACK;在这里毫无作用。- 因为前两个
UPDATE已经被"硬提交"了,ROLLBACK无法撤销它们。
MEMORY引擎
所有的数据都在内存中,不是磁盘。数据的处理速度快,但是安全性不高。
最大问题是重启数据丢失。只有表锁。数据太大内存吃不消。
默认是HASH索引,优点等值查询极快,缺点范围查询差。
对比
| 特性 | InnoDB | MyISAM | MEMORY |
|---|---|---|---|
| 事务 | ✅ | ❌ | ❌ |
| 行锁 | ✅ | ❌ | |
| 表锁 | 少 | ✅ | ✅ |
| MVCC | ✅ | ❌ | ❌ |
| 外键 | ✅ | ❌ | ❌ |
| 崩溃恢复 | ✅ | ❌ | ❌ |
| 数据存储 | 磁盘 | 磁盘 | 内存 |
| 重启保留数据 | ✅ | ✅ | ❌ |
| 默认索引 | B+树 | B+树 | HASH |
| 并发能力 | 高 | 低 | 中 |
| 当前主流 | ⭐⭐⭐⭐⭐ | ⭐ | ⭐⭐ |