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=1MyISAM:
只能:
锁整张表3. MVCC
InnoDB:
支持:
多版本并发控制。
所以:
普通查询:
不需要加锁。
四、InnoDB 整体架构 ⭐⭐⭐⭐⭐
InnoDB 可以理解为:
InnoDB +----------------+ | Buffer Pool | +----------------+ +----------------+ | Redo Log | +----------------+ +----------------+ | Undo Log | +----------------+ +----------------+ | 数据文件 | +----------------+核心:
四大组件:
- Buffer Pool
- Redo Log
- Undo Log
- 数据文件
五、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=202. MVCC
保存历史版本:
当前版本 ↓ 旧版本 ↓ 更旧版本九、Redo Log 和 Undo Log 区别 ⭐⭐⭐⭐⭐
| Redo Log | Undo 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. 后台刷磁盘十六、本节总结
| 概念 | 作用 |
|---|---|
| InnoDB | MySQL默认存储引擎 |
| 事务 | 保证业务一致性 |
| 行锁 | 提高并发 |
| MVCC | 提高读取能力 |
| Buffer Pool | 缓存数据 |
| Redo Log | 保证持久性 |
| Undo Log | 回滚和MVCC |
| B+Tree | 索引结构 |
| 聚簇索引 | 主键索引 |
🎯 本节核心一句话:
InnoDB 通过 Buffer Pool 提升读性能,通过 Redo Log 保证崩溃恢复,通过 Undo Log + MVCC 保证事务一致性,是 MySQL 高并发场景的核心存储引擎。