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 nameTom WHERE id1;只锁id1MyISAM只能锁整张表3. MVCCInnoDB支持多版本并发控制。所以普通查询不需要加锁。四、InnoDB 整体架构 ⭐⭐⭐⭐⭐InnoDB 可以理解为InnoDB ---------------- | Buffer Pool | ---------------- ---------------- | Redo Log | ---------------- ---------------- | Undo Log | ---------------- ---------------- | 数据文件 | ----------------核心四大组件Buffer PoolRedo LogUndo Log数据文件五、Buffer Pool缓冲池⭐⭐⭐⭐⭐这是 InnoDB 性能核心。问题磁盘慢。例如读取数据CPU | 内存 | 磁盘磁盘 IO非常慢。所以InnoDB把热点数据放入内存。这个区域叫Buffer Pool流程查询数据SQL ↓ Buffer Pool ↓ 找到 ↓ 返回如果没有SQL ↓ 磁盘 ↓ 读取 ↓ 返回效率低。六、Buffer Pool 工作流程例如查询SELECT * FROM user WHERE id1;第一次Buffer Pool 没有数据 ↓ 读取磁盘 ↓ 放入 Buffer Pool ↓ 返回第二次Buffer Pool 已有数据 ↓ 直接返回这叫缓存命中七、Redo Log重做日志⭐⭐⭐⭐⭐问题事务提交后数据一定马上写磁盘吗答案不一定。如果每次修改直接写磁盘性能很低。InnoDB采用WALWrite Ahead Logging预写日志。思想先写日志再写数据。例如执行UPDATE user SET age20 WHERE id1;流程修改数据 ↓ 写 Redo Log ↓ 事务提交 ↓ 后台慢慢刷新数据文件如果突然断电怎么办恢复读取 Redo Log。重新执行修改。所以Redo Log 保证持久性Durability八、Undo Log回滚日志上一节讲过。作用两个1. 回滚例如事务UPDATE user SET age30;失败恢复age202. 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 ↓ 数据 BTree索引十一、InnoDB 索引结构回顾InnoDB默认BTree。结构Root / \ Node Node / \ / \ Leaf Leaf Leaf Leaf特点数据存储在叶子节点。主键索引叫聚簇索引十二、聚簇索引 ⭐⭐⭐⭐⭐InnoDB数据和主键索引存一起。例如表user主键id结构BTree id | | 完整数据查询SELECT * FROM user WHERE id10;一次找到数据。十三、二级索引辅助索引例如创建CREATE INDEX idx_name ON user(name);结构name索引 Tom | id10查询WHERE nameTom流程name索引 ↓ 找到id ↓ 根据id查完整数据这个过程叫回表十四、为什么推荐使用自增主键原因InnoDB主键是聚簇索引。如果主键不断增加1 2 3 4插入顺序追加。效率高。如果UUID8fa3... 1abc... 9def...随机插入。可能页分裂。性能下降。十五、InnoDB 一次 SQL 执行流程例如UPDATE user SET nameTom WHERE id1;流程1. 查询数据 ↓ 2. Buffer Pool ↓ 3. 修改内存数据 ↓ 4. 写 Undo Log ↓ 5. 写 Redo Log ↓ 6. COMMIT ↓ 7. 后台刷磁盘十六、本节总结概念作用InnoDBMySQL默认存储引擎事务保证业务一致性行锁提高并发MVCC提高读取能力Buffer Pool缓存数据Redo Log保证持久性Undo Log回滚和MVCCBTree索引结构聚簇索引主键索引 本节核心一句话InnoDB 通过 Buffer Pool 提升读性能通过 Redo Log 保证崩溃恢复通过 Undo Log MVCC 保证事务一致性是 MySQL 高并发场景的核心存储引擎。