MySQL 的 InnoDB 引擎 是 MySQL 中最常用、功能最强大的存储引擎,它支持 事务、行级锁、崩溃恢复、MVCC 等现代数据库引擎必备能力。
???? InnoDB 是什么?
InnoDB 是 MySQL 的默认存储引擎(从 MySQL 5.5 开始),是一个支持高并发、高可靠性、高性能的事务型存储引擎。
???? InnoDB 的核心特性
功能点 | 说明 |
---|---|
✅ 事务支持 | 支持 ACID,保证数据可靠性 |
✅ 行级锁 | 并发更高,比 MyISAM 的表锁先进 |
✅ 崩溃恢复机制 | 使用 redo log + undo log 实现 crash-safe |
✅ MVCC | 实现一致性读,提高并发性能 |
✅ 外键支持 | 支持外键约束(MyISAM 不支持) |
✅ 聚簇索引 | 数据和主键索引存储在一起,提高主键查询效率 |
???? 核心组件详解
1️⃣ 事务系统
- 使用 undo log 回滚数据、实现 MVCC
- 使用 redo log 实现事务的持久化
- 支持事务的四大特性:原子性、一致性、隔离性、持久性(ACID)
2️⃣ Buffer Pool(缓冲池)
- 用于缓存数据页、索引页、undo页等
- 提高 IO 效率,减少磁盘访问次数
- 类似数据库的“内存数据库”,访问数据尽量走内存
3️⃣ 索引结构
- InnoDB 的主键索引是 聚簇索引(Clustered Index)
- 数据和索引是存一起的
- 辅助索引(Secondary Index)里存的是主键值,而不是行的物理地址
4️⃣ MVCC(多版本并发控制)
- 使用 undo log 和隐藏的事务信息字段(trx_id, roll_pointer)实现
- 支持一致性读(Consistent Read)
- 实现非阻塞读(即你查的时候不会被锁)
5️⃣ 锁机制
- 行锁、间隙锁(Gap Lock)、Next-Key Lock
- 支持事务的隔离级别(READ COMMITTED, REPEATABLE READ 等)
- 防止幻读、死锁检测
6️⃣ 日志系统
- redo log:物理日志,保证崩溃恢复
- undo log:逻辑日志,支持回滚和 MVCC
- binlog:Server 层的日志,主从复制使用(不属于 InnoDB)
???? 举个简单事务的例子
START TRANSACTION;
UPDATE users SET balance = balance - 100 WHERE id = 1;
-- 此时数据写入 redo log(prepare),undo log 记录原值
-- 数据页修改在 buffer pool 中
-- 并未真正提交
COMMIT;
-- redo log commit,数据持久化,事务完成
???? 总结
InnoDB 是一个支持高并发事务、崩溃恢复、行级锁和 MVCC 的现代存储引擎,是 MySQL 数据安全性和性能的核心保障。