MySQL 系统学习 第四阶段:MySQL 高级 第七节:InnoDB 存储引擎

📅 2026/7/14 5:20:53 👁️ 阅读次数 📝 编程学习
MySQL 系统学习 第四阶段:MySQL 高级 第七节:InnoDB 存储引擎

前面我们学习:

  • 事务:保证数据操作可靠
  • :解决并发修改问题
  • MVCC:解决高并发读取问题

这些能力是谁提供的?

答案:

InnoDB 存储引擎


一、什么是存储引擎?

MySQL 不是直接负责数据存储的。

MySQL 分为:

MySQL Server | | 存储引擎 | | 磁盘文件

存储引擎负责:

  • 数据如何存储
  • 如何读取
  • 是否支持事务
  • 是否支持锁
  • 是否支持索引

例如:

同一个 MySQL:

可以有:

user表 → InnoDB log表 → MyISAM

不同表可以使用不同引擎。


二、MySQL 常见存储引擎

查看:

SHOW ENGINES;

常见:

引擎特点
InnoDB支持事务、行锁(默认)
MyISAM查询快、不支持事务
Memory数据存内存
Archive归档数据

现在企业开发:

基本:

99% 使用 InnoDB


三、为什么 InnoDB 成为默认引擎?

因为它支持:

⭐⭐⭐⭐⭐

1. 事务

例如:

订单:

创建订单 扣库存 扣余额

必须:

全部成功。


InnoDB:

支持:

BEGIN; COMMIT; ROLLBACK;

MyISAM:

不支持事务。


2. 行级锁

InnoDB:

支持:

锁一行数据

例如:

UPDATE user SET name='Tom' WHERE id=1;

只锁:

id=1

MyISAM:

只能:

锁整张表

3. MVCC

InnoDB:

支持:

多版本并发控制。

所以:

普通查询:

不需要加锁。


四、InnoDB 整体架构 ⭐⭐⭐⭐⭐

InnoDB 可以理解为:

InnoDB +----------------+ | Buffer Pool | +----------------+ +----------------+ | Redo Log | +----------------+ +----------------+ | Undo Log | +----------------+ +----------------+ | 数据文件 | +----------------+

核心:

四大组件:

  1. Buffer Pool
  2. Redo Log
  3. Undo Log
  4. 数据文件

五、Buffer Pool(缓冲池)⭐⭐⭐⭐⭐

这是 InnoDB 性能核心。

问题:

磁盘慢。

例如:

读取数据:

CPU | 内存 | 磁盘

磁盘 IO:

非常慢。


所以:

InnoDB:

把热点数据放入内存。

这个区域:

叫:

Buffer Pool


流程:

查询数据:

SQL ↓ Buffer Pool ↓ 找到 ↓ 返回

如果没有:

SQL ↓ 磁盘 ↓ 读取 ↓ 返回

效率低。


六、Buffer Pool 工作流程

例如:

查询:

SELECT * FROM user WHERE id=1;

第一次:

Buffer Pool 没有数据 ↓ 读取磁盘 ↓ 放入 Buffer Pool ↓ 返回

第二次:

Buffer Pool 已有数据 ↓ 直接返回

这叫:

缓存命中


七、Redo Log(重做日志)⭐⭐⭐⭐⭐

问题:

事务提交后:

数据一定马上写磁盘吗?

答案:

不一定。


如果:

每次修改:

直接写磁盘:

性能很低。


InnoDB:

采用:

WAL(Write Ahead Logging)

预写日志。

思想:

先写日志,再写数据。


例如:

执行:

UPDATE user SET age=20 WHERE id=1;

流程:

修改数据 ↓ 写 Redo Log ↓ 事务提交 ↓ 后台慢慢刷新数据文件

如果突然断电:

怎么办?

恢复:

读取 Redo Log。

重新执行修改。


所以:

Redo Log 保证:

持久性(Durability)


八、Undo Log(回滚日志)

上一节讲过。

作用:

两个:

1. 回滚

例如:

事务:

UPDATE user SET age=30;

失败:

恢复:

age=20

2. MVCC

保存历史版本:

当前版本 ↓ 旧版本 ↓ 更旧版本

九、Redo Log 和 Undo Log 区别 ⭐⭐⭐⭐⭐

Redo LogUndo Log
作用恢复提交的数据恢复修改前的数据
方向向前恢复向后回滚
保证持久性原子性、MVCC
场景断电恢复事务回滚

简单记:

Redo Log: 我要重新做一遍 Undo Log: 我要撤销刚才操作

十、InnoDB 数据文件结构

MySQL 数据:

存储在:

数据目录

查看:

SHOW VARIABLES LIKE 'datadir';

InnoDB:

主要文件:

.ibd 文件

例如:

user.ibd

存:

  • 表数据
  • 索引

例如:

user表 ↓ user.ibd ↓ 数据 + B+Tree索引

十一、InnoDB 索引结构回顾

InnoDB:

默认:

B+Tree。


结构:

Root / \ Node Node / \ / \ Leaf Leaf Leaf Leaf

特点:

数据存储在:

叶子节点。


主键索引:

叫:

聚簇索引


十二、聚簇索引 ⭐⭐⭐⭐⭐

InnoDB:

数据和主键索引存一起。

例如:

表:

user

主键:

id

结构:

B+Tree id | | 完整数据

查询:

SELECT * FROM user WHERE id=10;

一次找到数据。


十三、二级索引(辅助索引)

例如:

创建:

CREATE INDEX idx_name ON user(name);

结构:

name索引 Tom | id=10

查询:

WHERE name='Tom'

流程:

name索引 ↓ 找到id ↓ 根据id查完整数据

这个过程:

叫:

回表


十四、为什么推荐使用自增主键?

原因:

InnoDB:

主键是聚簇索引。

如果:

主键不断增加:

1 2 3 4

插入:

顺序追加。

效率高。


如果:

UUID:

8fa3... 1abc... 9def...

随机插入。

可能:

页分裂。

性能下降。


十五、InnoDB 一次 SQL 执行流程

例如:

UPDATE user SET name='Tom' WHERE id=1;

流程:

1. 查询数据 ↓ 2. Buffer Pool ↓ 3. 修改内存数据 ↓ 4. 写 Undo Log ↓ 5. 写 Redo Log ↓ 6. COMMIT ↓ 7. 后台刷磁盘

十六、本节总结

概念作用
InnoDBMySQL默认存储引擎
事务保证业务一致性
行锁提高并发
MVCC提高读取能力
Buffer Pool缓存数据
Redo Log保证持久性
Undo Log回滚和MVCC
B+Tree索引结构
聚簇索引主键索引

🎯 本节核心一句话:

InnoDB 通过 Buffer Pool 提升读性能,通过 Redo Log 保证崩溃恢复,通过 Undo Log + MVCC 保证事务一致性,是 MySQL 高并发场景的核心存储引擎。