news 2026/5/1 11:41:41

MySQL每次 DML 操作生成 Redo 记录的庖丁解牛

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
MySQL每次 DML 操作生成 Redo 记录的庖丁解牛

MySQL 每次 DML(INSERT/UPDATE/DELETE)操作生成 Redo 记录,是InnoDB 实现 WAL(Write-Ahead Logging)和崩溃恢复的核心机制


一、Redo 记录的本质

  • 不是逻辑日志(如 “UPDATE users SET name=‘John’ WHERE id=100”)
  • 而是物理日志
    “在数据页 X 的偏移 Y 处,写入 Z 字节的数据”
  • 目的
    崩溃恢复时,能精确重放内存中的修改,无论原始 SQL 是什么。

关键特性
Redo 记录与 SQL 无关,只与物理存储变更相关


二、DML 操作如何触发 Redo 生成

1.通用流程
RedoLogBufferBufferPoolInnoDBINSERT/UPDATE/DELETERedoLogBufferBufferPoolInnoDBINSERT/UPDATE/DELETE执行修改定位/加载目标数据页修改内存中的页生成 Redo 记录
2.各 DML 类型的 Redo 内容
操作Redo 记录内容
INSERT- 聚簇索引页插入记录
- 所有二级索引页插入记录
- Undo Log 页插入回滚段
UPDATE- 聚簇索引页原记录标记删除 + 新记录插入
- 二级索引页若键值变更:删除旧 + 插入新
- Undo Log 更新
DELETE- 聚簇索引页记录标记删除
- 二级索引页记录标记删除
- Undo Log 插入

⚠️注意
即使 UPDATE 未改变索引列,仍会生成聚簇索引的 Redo(因行数据变更)。


三、Redo 记录的内部结构

InnoDB Redo 记录采用类型化日志格式,核心字段:

// 伪代码:Redo 记录头structredo_header{uint16_ttype;// 日志类型(MLOG_1BYTE, MLOG_4BYTES...)uint16_tspace_id;// 表空间IDuint32_tpage_no;// 页号uint16_toffset;// 页内偏移uint16_tlength;// 数据长度byte data[];// 变更数据};
典型日志类型:
类型说明示例
MLOG_WRITE_STRING写入字符串插入 VARCHAR 列
MLOG_4BYTES写入 4 字节整数更新 INT 列
MLOG_REC_INSERT插入完整记录INSERT 新行
MLOG_REC_DELETE_MARK标记删除DELETE 操作

💡为什么分类型
减少日志体积:仅记录变更部分,而非整个页。


四、生成 Redo 的详细步骤(以 UPDATE 为例)

假设执行:

UPDATEproductsSETprice=100WHEREid=1000;
步骤 1:定位数据页
  • 通过聚簇索引(主键 id)找到页 P1
  • 若有二级索引(如idx_price),找到页 P2
步骤 2:修改 Buffer Pool
  • P1 页
    • 原记录标记为“已删除”
    • 插入新记录(price=100)
  • P2 页(若 price 变更):
    • 删除旧索引项(price=50)
    • 插入新索引项(price=100)
步骤 3:生成 Redo 记录
  1. 聚簇索引 Redo
    • MLOG_REC_DELETE_MARK:标记原记录删除
    • MLOG_REC_INSERT:插入新记录
  2. 二级索引 Redo(若 price 变更):
    • MLOG_REC_DELETE:删除旧索引项
    • MLOG_REC_INSERT:插入新索引项
  3. Undo Log Redo
    • MLOG_WRITE_STRING:写入旧值(price=50)到 Undo 页
步骤 4:写入 Redo Log Buffer
  • 所有 Redo 记录追加到内存缓冲区
  • 不立即刷盘(除非 COMMIT 或缓冲区满)

五、Redo 生成的性能影响

1.CPU 开销
  • 序列化 Redo 记录:需构造二进制日志
  • 校验和计算:每条记录含 CRC32 校验
2.I/O 开销
  • Redo Log 写入
    • 顺序 I/O(高效)
    • fsync是昂贵操作(尤其 HDD)
  • Double Write
    脏页刷盘时额外写双写区 → 2x I/O
3.内存开销
  • Redo Log Buffer
    大事务可能填满缓冲区 → 触发提前刷盘
  • Undo Log
    长事务积累大量 Undo → 占用 Buffer Pool

📊实测数据

  • 纯内存操作(Buffer Pool 命中):Redo 生成占 CPU 10–20%
  • 磁盘 I/O 密集:Redofsync成为主要瓶颈

六、优化 Redo 生成的策略

1.减少 Redo 量
  • 删除无用索引:每个索引 = 额外 Redo
  • 避免大字段更新:TEXT/BLOB 更新生成大量 Redo
  • 批量操作
    -- 优于 1000 条单条 UPDATEUPDATEproductsSETprice=price*1.1WHEREcategory='A';
2.调整 Redo 配置
# 增大日志文件(减少 checkpoint) innodb_log_file_size = 2G # 增大缓冲区(减少提前刷盘) innodb_log_buffer_size = 64M # 组提交优化(MySQL 5.7+) innodb_flush_log_at_trx_commit = 1 # 安全 # innodb_flush_log_at_timeout = 1 # 后台刷盘间隔
3.硬件加速
  • NVMe SSD:降低fsync延迟
  • Battery-Backed Write Cache (BBWC)
    RAID 卡缓存fsync,提升吞吐

七、监控 Redo 生成

1.关键指标
-- Redo 日志生成速率SHOWGLOBALSTATUSLIKE'Innodb_os_log_written';-- 日志等待次数(缓冲区不足)SHOWGLOBALSTATUSLIKE'Innodb_log_waits';
2.解析 Redo 内容(高级)
  • 使用 mysqlbinlog(仅限 binlog,非 Redo)
  • InnoDB Recovery 工具
    innodb_ruby可解析.ibd和 Redo 文件(需停机)

八、总结:Redo 生成心法

  • Redo 是物理变更的精确录像,与 SQL 语义无关。
  • 每次 DML = 多条 Redo 记录(聚簇索引 + 二级索引 + Undo)。
  • 性能瓶颈常在fsync,而非 Redo 生成本身。
  • 优化核心
    减少索引数量 + 批量操作 + 高速存储

💡终极原则
“Redo 不是开销,而是可靠性的保险费——
付多少,取决于你对数据安全的重视程度。”

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 4:04:33

如何快速掌握PoeCharm:流放之路Build计算终极指南

如何快速掌握PoeCharm:流放之路Build计算终极指南 【免费下载链接】PoeCharm Path of Building Chinese version 项目地址: https://gitcode.com/gh_mirrors/po/PoeCharm 还在为《流放之路》复杂的伤害计算和装备搭配而烦恼吗?PoeCharm作为Path o…

作者头像 李华
网站建设 2026/5/1 4:05:04

LeetDown终极解决方案:iPhone系统降级深度技术解析

LeetDown终极解决方案:iPhone系统降级深度技术解析 【免费下载链接】LeetDown a GUI macOS Downgrade Tool for A6 and A7 iDevices 项目地址: https://gitcode.com/gh_mirrors/le/LeetDown 还在为iPhone系统升级后的性能衰退而困扰?LeetDown作为…

作者头像 李华
网站建设 2026/5/1 4:04:11

ResNet18从零开始:小白用云端GPU当天跑通案例

ResNet18从零开始:小白用云端GPU当天跑通案例 引言:文科生也能玩转AI的捷径 作为一名文科背景的AI爱好者,你是否曾被PyTorch环境配置、CUDA版本冲突、依赖包安装等问题劝退?传统学习路径往往要求先花数周时间搭建开发环境&#…

作者头像 李华
网站建设 2026/5/1 5:03:38

BongoCat桌面宠物完全指南:从零开始打造个性化数字伴侣

BongoCat桌面宠物完全指南:从零开始打造个性化数字伴侣 【免费下载链接】BongoCat 让呆萌可爱的 Bongo Cat 陪伴你的键盘敲击与鼠标操作,每一次输入都充满趣味与活力! 项目地址: https://gitcode.com/gh_mirrors/bong/BongoCat 在数字…

作者头像 李华
网站建设 2026/5/1 5:01:31

Windows 10 OneDrive彻底卸载:专业级清理方案深度解析

Windows 10 OneDrive彻底卸载:专业级清理方案深度解析 【免费下载链接】OneDrive-Uninstaller Batch script to completely uninstall OneDrive in Windows 10 项目地址: https://gitcode.com/gh_mirrors/one/OneDrive-Uninstaller 在日常使用Windows 10的过…

作者头像 李华
网站建设 2026/5/1 6:14:05

ResNet18实战教程:构建智能零售货架识别系统

ResNet18实战教程:构建智能零售货架识别系统 1. 引言:通用物体识别与ResNet-18的工程价值 在智能零售、无人货架、自动结算等场景中,快速准确地识别商品类别是实现自动化运营的核心能力。传统方案依赖人工标注或规则匹配,效率低…

作者头像 李华