当前位置: 首页 > news >正文

Redo / Undo / WAL(为什么 MySQL 写比读复杂)

🔥 一句话先破题

MySQL 的所有写操作 = 改内存 + 写日志(两个日志) → 最后才慢慢刷磁盘数据页。

原因是:

直接改磁盘太慢,且不安全,必须通过日志来“骗过磁盘的慢”。

这就是 WAL(Write-Ahead Logging)的本质。


🍔 先上总图(最通俗的写流程,助你先有大局观)

你执行:

UPDATE user SET age=20 WHERE id=1;

InnoDB 实际上做了 4 件事:

  1. 生成 Undo Log:记录“怎么回滚”
  2. 改内存中的数据页(Buffer Pool)
  3. 生成 Redo Log:记录“怎么重做”
  4. 先把 Redo Log 落盘(刷到 redo log file)
    这是 WAL:先写日志,再写数据

最终数据页还是在内存里,过一段时间才被刷回磁盘(flush)。

为什么要搞这么多环节?
因为磁盘太慢了,数据库只能耍聪明。


🟦 1. Undo Log:用来“穿越时间”的日志

Undo Log 是 MySQL 自己的“时光倒流机器”。

用途:

  • 事务回滚(roll back)
  • MVCC 读取旧版本(快照读)

你更新 age=20,那么 Undo Log 会记录:

原来的 age=18
原来的 row trx_id=xxx

也就是:
我怎么把这一行恢复到更新前?

Undo Log 存在 Undo Segment 里,属于“逻辑日志”。


🟥 2. Redo Log:保障 Crash-Safe 的日志(比 Undo 更底层)

Redo Log 不是为了回滚,而是为了 宕机恢复(Crash Recovery)

Redo Log 记录的是:

我对某个页做了哪些物理操作(偏移量 + 改了什么值)

也就是:

数据库重启后,我可以照着 redo log 把内存里的修改重新“补”到磁盘页上。

Redo Log 是物理日志,且是循环写的(固定大小文件,如 2GB)。


🧊 Undo + Redo 的关系指南(最容易混)

你可以这样记:

目标 用哪个
想回到过去(回滚) Undo Log
想补上未来(崩溃恢复) Redo Log
想恢复旧版本记录给 MVCC Undo Log

Undo 是 “回滚我自己”
Redo 是 “重做我做过的事”

两个日志互补,缺一不可。


🧠 3. WAL:Write-Ahead Logging(写之前先记账)

核心原则:

数据还没写盘可以,但 redo log 必须先写盘。

为什么?
因为如果只改了内存,MySQL 崩了,那数据就丢了。

所以写流程如下:

BEGIN;
改内存页 → 写 redo buffer → 刷 redo log(fsync) → COMMIT

数据页本身可以晚点刷盘(这叫异步刷盘),
但 redo log 必须先落盘,才能保证“崩了不丢”。

这就是 WAL 的灵魂。


🎬 4. 整个写查询的动画版(让你脑补一遍)

🔔 步骤 1:生成 Undo Log

为了能回滚 → 先记录旧值

Undo Log: {id=1, old age=18}

🧱 步骤 2:修改内存页(Buffer Pool)

页还没刷到磁盘,只是在 RAM 里改了一份。

📝 步骤 3:生成 Redo Log(InnoDB Log Buffer)

记录“我改了哪个页、偏移量、改了什么字段”。

🔥 步骤 4:刷 Redo Log 到磁盘

这是 commit 时最关键的一步
也是 MySQL 写性能瓶颈的来源(fsync)

保证崩机也能恢复

🕒 步骤 5:后台慢慢把数据页刷盘(异步)

最终数据会被刷到磁盘的 .ibd 文件。

注意:这个步骤跟 commit 无关,不需要马上做。


🧨 为什么 MySQL 写比读复杂?(重点解释)

读:

  • 看 Buffer Pool
  • 没有 → 读一页
  • 完事

写:
需要:

✔ 1. 生成 Undo Log

为了回滚 + MVCC 历史版本

✔ 2. 改 Buffer Pool

脏页(dirty page)形成

✔ 3. 生成 Redo Log

为了 crash-safe

✔ 4. WAL:Redo 先刷盘(昂贵的 fsync)

这是必须的

✔ 5. 后台还要刷脏页(checkpoint)

由后台线程专门处理

✔ 6. Redo Log 是循环写 → 还要配合 checkpoint

避免覆盖

写操作包含:

  • 两份日志(Undo/Redo)
  • 两次写(redo write、data page write)
  • 事务管理
  • MVCC 版本链维护
  • 缓冲池管理

写要做的事情至少是读取的 5〜10 倍。


🧩 再讲一个你一定会懂的比喻:

想象你写论文:

读论文 = 打开文件 → 读一小段 → 做笔记 → 关掉

写论文 =

  1. 做备份(Undo)
  2. 打草稿(改内存页)
  3. 写修改日志(Redo)
  4. 把日志保存到本地(WAL:fsync)
  5. 最后再慢慢把最终版本保存(Checkpoint)

写比读累得多这一点,就很像 MySQL。


🎯 最终总结一张图(你面试用它吊打别人)

            +---------------------+|    Client SQL       |+---------+-----------+|v+------------------------------+|      1. Undo Log(逻辑)     |+------------------------------+|v+------------------------------+| 2. 修改 Buffer Pool 页(内存)|+------------------------------+|v+------------------------------+|   3. Redo Log(物理日志)     |+------------------------------+|v+------------------------------+|   4. WAL:先写 redo 文件     ||     (fsync, 最关键最慢)      |+------------------------------+|事务提交成功|v+------------------------------+|   5. 后台刷脏页到磁盘(慢)   |+------------------------------+
http://www.jsqmd.com/news/64101/

相关文章:

  • 政府智能留样柜服务商推荐,知名度高的智能留样柜厂家全解析
  • MVCC 机制(RC / RR 的真正区别)
  • 1分钟AI一键生成歌曲软件推荐
  • 2025论文降重降AI神器终极对决!用学术猹,AI率轻松降至个位数!
  • 2025 年 12 月软件开发公司权威推荐榜:小程序开发、APP开发,技术实力与创新服务深度解析
  • 2025年十大口碑好的智能消毒柜源头厂家推荐,学校智能消毒柜
  • 2025年上海财税服务公司排名:宝园财税的服务灵活性、基本信
  • 2025年捏合机品牌排名推荐:力创捏合机口碑怎么样?
  • 2025年全国井式炉十大源头厂家排行榜,正规厂商专业制造商新
  • 2025 年 12 月软件开发公司权威推荐榜:创新引擎与高效交付口碑之选
  • 10411_基于Springboot的物业管理系统
  • 2025年12月小程序开发服务商权威推荐榜:创新赋能与用户体验口碑之选,深度解析技术实力与市场竞争力
  • 实用指南:2. 单片机基础概述
  • 2025年12月APP开发公司权威推荐榜:创新技术与用户体验双轮驱动,精选实力派开发团队深度解析
  • 2025年上海十大民事纠纷处理机构推荐:看哪家口碑好
  • B+Tree(理解索引为什么这样做)
  • 2025年12月车间喷淋喷雾,车间喷雾降尘设备,高压喷雾机厂家最新推荐:喷雾精度与品牌筛选
  • 2025年12月降尘喷淋系统,工地喷淋,车间喷淋降温系统厂家最新推荐:降温效果与品质参考
  • 內網滲透:Metasploit、Cobalt Strike使用
  • 2N7002K-ASEMI智能家居控制专用2N7002K
  • 2025年深圳Top5智能营销SaaS公司排行榜:南方网通优
  • 探秘中臻达:钢结构领域的靠谱之选
  • 20232411 2025-2026-1 《网络与系统攻防技术》实验八实验报告
  • VC(9.0~14.x)运行库下载链接
  • Kubernetes集群的搭建与DevOps实践(上)- 架构设计篇
  • 2025年景观护栏设计公司五大推荐,景观护栏设计厂家选哪家合
  • 2025年中国口碑好的包装箱木箱公司推荐:木头包装箱定制厂家
  • 2025年电线电缆,国标电线电缆,铜芯电线电缆厂家推荐:行业盘点与品质红榜发布
  • 2025年电线电缆,国标电线电缆,铜芯电线电缆厂家推荐,高稳定,导电强的行业优选
  • 【QT/C++】Qt基础控件详解:输入与显示控件(超详细) - 详解