Mysql 中的 innodb 引擎

时间:2025-04-05 18:55:53

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 数据安全性和性能的核心保障。