MySQL 修改数据的全链路流程

MySQL 修改数据的全链路流程(InnoDB)

  • 全链路流程图
  • 关键步骤详解
    • 1. 建立连接阶段
    • 2.SQL解析与优化
    • 3. InnoDB内存操作
    • 4. 日志记录过程
    • 5. 二阶段提交(2PC)
  • 磁盘同步机制
    • 1. Redo Log刷盘策略(innodb_flush_log_at_trx_commit)
    • 2. Binlog刷盘策略(sync_binlog)
    • 3. 脏页刷新机制
  • 异常恢复流程
  • 性能优化要点
    • 1. 日志相关参数
    • 2.监控指标
  • 全链路耗时分布(示例)

全链路流程图

Client Connector BufferPool UndoLog RedoLog Binlog Disk 建立TCP连接 线程身份验证 发送UPDATE语句 检查数据页是否在内存 从磁盘加载数据页 返回数据页 alt [数据页不在内存] 记录修改前值(回滚日志) 修改内存数据页 记录物理变更(重做日志) prepare状态 记录逻辑变更 发送ack commit状态 返回执行成功 异步刷脏页 循环写日志文件 同步到磁盘 loop [后台线程处理] Client Connector BufferPool UndoLog RedoLog Binlog Disk

在这里插入图片描述

关键步骤详解

1. 建立连接阶段

查看当前连接

SHOW PROCESSLIST;
  • TCP三次握手建立连接
  • 线程验证(用户名/密码/IP白名单)
  • 连接池分配线程ID

2.SQL解析与优化

– 查看执行计划

EXPLAIN UPDATE users SET balance=100 WHERE id=5;
  • 语法解析器生成解析树
  • 优化器选择执行计划(是否走索引)

3. InnoDB内存操作

// 伪代码:Buffer Pool处理
if (!page_in_buffer_pool) {read_page_from_disk();
}row = find_row_in_page();
old_data = copy_row(row);  // 用于undo log
modify_row(row);           // 内存修改

4. 日志记录过程

日志类型内容示例写入时机
Undo Log把id=5的balance从200改为100修改前记录
Redo Logpage_no=3, offset=128, value=100prepare阶段
BinlogUPDATE users SET balance=100 WHERE id=5事务提交前

5. 二阶段提交(2PC)

客户端提交
Redo Log prepare
Binlog写入
Redo Log commit

磁盘同步机制

为什么Mysql不能直接更新磁盘上的数据而且设置这么一套复杂的机制来执行SQL了?
因为来一个请求就直接对磁盘文件进行随机读写,然后更新磁盘文件里的数据性能可能相当差。
因为磁盘随机读写的性能是非常差的,所以直接更新磁盘文件是不能让数据库抗住很高并发的。
Mysql这套机制看起来复杂,但它可以保证每个更新请求都是更新内存BufferPool,然后顺序写日志文件,同时还能保证各种异常情况下的数据一致性。
更新内存的性能是极高的,然后顺序写磁盘上的日志文件的性能也是非常高的,要远高于随机读写磁盘文件。
正是通过这套机制,才能让我们的MySQL数据库在较高配置的机器上每秒可以抗下几干甚至上万的读写请求

1. Redo Log刷盘策略(innodb_flush_log_at_trx_commit)

# my.cnf配置
innodb_flush_log_at_trx_commit=1  # 最安全(每次提交刷盘)

2. Binlog刷盘策略(sync_binlog)

sync_binlog=1  # 每次提交同步到磁盘

3. 脏页刷新机制

-- 查看刷页状态
SHOW ENGINE INNODB STATUS\G
  • 当脏页比例超过innodb_max_dirty_pages_pct(默认75%)时触发
  • 使用双写缓冲(Double Write Buffer)防止页断裂

异常恢复流程

graph TDA[MySQL启动] --> B{发现异常关闭标志?}B -->|是| C[进入崩溃恢复模式]B -->|否| Z[正常启动流程]C --> D[重做阶段 Redo Phase]D --> D1[从最后一个检查点LSN开始]D1 --> D2[扫描redo log文件]D2 --> D3[应用所有有效的redo记录]D3 --> D4[更新Buffer Pool中的脏页]D --> E[检查二阶段提交状态]E --> E1{Redo处于prepare状态?}E1 --是--> F[检查对应binlog]E1 --否--> G[事务已提交,跳过]   F --> F1{Binlog完整存在?}F1 -->|是| H[提交事务 XA COMMIT]F1 -->|否| I[回滚事务 XA ROLLBACK]H & I --> J[回滚阶段 Undo Phase]J --> J1[扫描undo log]J1 --> J2[回滚所有未提交事务]J2 --> J3[释放相关锁资源]J --> K[清理阶段 Purge Phase]K --> K1[清理无效undo日志]K1 --> K2[删除无用的历史版本]K2 --> K3[更新数据字典]K --> L[完成恢复]L --> M[服务可用]

在这里插入图片描述

性能优化要点

1. 日志相关参数

innodb_log_file_size=4G        # 更大的redo log文件
innodb_log_buffer_size=256M    # 增大日志缓冲区
binlog_group_commit_sync_delay=100  # 延迟组提交(微秒)

2.监控指标

-- 查看日志写入情况
SELECT * FROM performance_schema.innodb_metrics 
WHERE NAME LIKE '%log%';-- 查看脏页比例
SELECT (SELECT variable_value FROM information_schema.global_status 
WHERE variable_name='Innodb_buffer_pool_pages_dirty') / 
(SELECT variable_value FROM information_schema.global_status 
WHERE variable_name='Innodb_buffer_pool_pages_total') AS dirty_ratio;

全链路耗时分布(示例)

阶段典型耗时可优化手段
网络连接1-10ms使用连接池
SQL解析0.1-1ms避免复杂SQL
内存查找0.01-0.1ms增大Buffer Pool
日志写入0.5-5ms调整刷盘策略
磁盘同步1-10ms使用SSD

这个流程完整展示了从客户端发起到数据落盘的全过程,其中Redo Log的二阶段提交机制和WAL(Write-Ahead Logging)原则是保证ACID特性的关键设计。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/85484.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

兰亭妙微十六年高水准交互设计公司

北京兰亭妙微(蓝蓝设计)成立于 2008 年(前身为设计工作室,2011 年正式注册),由清华团队主创,专注软件和互联网 UI/UE 设计开发 16 年。我们提供从需求调研、界面设计到开发落地的全流程服务&…

【脚本 完全参数化的通用 APT 源配置方案-Debian/Ubuntu】

通过脚本在 Debian/Ubuntu 系统上一键切换 APT 源 如Dockerfile中 使用某个源(比如 aliyun) 假设你的目录结构是: . ├── Dockerfile └── switch-apt-source.shFROM ubuntu:22.04# 把脚本拷贝到镜像中 COPY switch-apt-source.sh /us…

学习日记-day20-6.1

完成目标&#xff1a; 知识点&#xff1a; 1.集合_Collections集合工具类 方法:static <T> boolean addAll(Collection<? super T> c, T... elements)->批量添加元素 static void shuffle(List<?> list) ->将集合中的元素顺序打乱static <T>…

个人总结八股文之-基础篇(持续更新)

一、集合的分类有哪些&#xff1f; Java集合框架主要分为两大类&#xff1a;Collection和Map Collection主要分为以下三类&#xff1a; List&#xff1a;有序集合&#xff0c;允许重复元素。常见的实现类有ArrayList、LinkedList和Vector。 Set&#xff1a;无序集合&#xf…

leetcode hot100刷题日记——35.子集

解答&#xff1a; 方法一&#xff1a;选or不选的dfs&#xff08;输入视角&#xff09; 思路&#xff1a;[1,2,3]的全部子集可以看成是对数组的每一位数字做选择。 eg.空集就是一个数字都不选&#xff0c;[1,2]就是1&#xff0c;2选&#xff0c;3不选。 class Solution { pub…

华为OD机试真题——生成哈夫曼树(2025A卷:100分)Java/python/JavaScript/C/C++/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》 华为OD机试真题《生成…

房屋租赁系统 Java+Vue.js+SpringBoot,包括房屋类型、房屋信息、预约看房、合同信息、房屋报修、房屋评价、房主管理模块

房屋租赁系统 JavaVue.jsSpringBoot&#xff0c;包括房屋类型、房屋信息、预约看房、合同信息、房屋报修、房屋评价、房主管理模块 百度云盘链接&#xff1a;https://pan.baidu.com/s/1KmwOFzN9qogyaLQei3b6qw 密码&#xff1a;l2yn 摘 要 社会的发展和科学技术的进步&#xf…

Unity 中 Update、FixedUpdate 和 LateUpdate 的区别及使用场景

在Unity开发中,Update、FixedUpdate 和 LateUpdate 是生命周期函数中最常见也最容易混淆的一组。 一、调用时机 方法名调用频率调用时机说明Update()每帧调用一次跟随帧率(帧率高则调用频率高)FixedUpdate()固定时间间隔调用默认每 0.02 秒执行一次LateUpdate()每帧调用一次…

Docker镜像之windows系统

https://github.com/dockur/windows 在 Docker 容器中运行 Windows 功能 ISO 下载器KVM 加速基于网页的查看器 使用方法 启动容器并通过浏览器连接到端口 8006。整个安装过程将全自动完成&#xff0c;无需手动干预。当桌面界面出现时&#xff0c;表示 Windows 安装已完成&a…

C# 用户控件(User Control)详解:创建、使用与最佳实践

在C#应用程序开发中&#xff0c;用户控件&#xff08;User Control&#xff09;是一种强大的工具&#xff0c;它允许开发者将多个标准控件组合成一个可复用的自定义组件。无论是Windows Forms还是WPF&#xff0c;用户控件都能显著提高UI开发的效率&#xff0c;减少重复代码&…

pikachu靶场通关笔记09 XSS关卡05-DOM型XSS-X

目录 一、XSS 二、DOM型XSS 三、源码分析 1、打开DOM-X型XSS关卡 2、XSS探测 3、源码分析 四、渗透实战 1、Payload1 2、Payload2 3、Payload3 五、DOM型XSS与DOM-X型XSS区别 本系列为通过《pikachu靶场通关笔记》的XSS攻击关卡(共10关&#xff09;渗透集合&#xf…

湖北理元理律所:企业债务重组中的“法律缓冲带”设计

一、担保链危机的法律拆解技术 中小企业债务困局多源于担保链蔓延。本所处理某制造企业案例时&#xff0c;运用三层法律工具阻断风险传导&#xff1a; 1. 主合同审查 → 发现银行擅自变更借款用途 → 援引《民法典》第695条解除担保 2. 股东责任切割 → 证明企业财产独立 …

调整数据集的方法

我们对worldquant中的数据&#xff0c; 对数据频率怎么算 在 WorldQuant 平台中&#xff0c;数据更新频率是影响量化策略有效性、回测准确性和实盘交易表现的核心因素之一。它决定了数据的时效性和连续性&#xff0c;直接关系到策略能否捕捉市场动态、应对突发事件或适应不同…

[Linux] Linux 系统从启动到驱动加载

Linux 系统从启动到驱动加载 文章目录 Linux 系统从启动到驱动加载一、硬件上电与 BIOS/UEFI 阶段1. 1 硬件上电初始化1.2 BIOS/UEFI执行过程1.3 Bootloader加载细节 二、Bootloader 阶段三、Linux 内核初始化3.1 架构相关初始化&#xff08;setup_arch&#xff09;3.2 核心子系…

Spring Boot DevTools 热部署

在Spring Boot项目中加入 spring-boot-devtools 热部署依赖启动器后&#xff0c;通常不需要手动重启项目即可让更改生效。spring-boot-devtools 的核心特性之一就是自动重启或热加载。 Spring Boot DevTools 热部署关键知识点 &#x1f525; 目的&#xff1a;spring-boot-devt…

uni-app学习笔记十五-vue3页面生命周期(二)

onShow&#xff1a;用于监听页面显示&#xff0c;页面每次出现在屏幕上都触发&#xff0c;包括从下级页面点返回露出当前页面&#xff1b; onHide:监听页面隐藏&#xff0c;当离开当前页面时触发。 示例代码&#xff1a; <template><view>姓名&#xff1a;{{nam…

LIKE ‘%xxx%‘ 和 LIKE ‘xxx%‘ 的索引影响分析

LIKE ‘%xxx%’ 和 LIKE ‘xxx%’ 的索引影响分析 一、基础概念解析 1.1 LIKE操作符的工作原理 LIKE是SQL中用于模式匹配的操作符,支持两种通配符: %:匹配任意数量字符(包括零个字符)_:匹配单个字符go专栏:https://duoke360.com/tutorial/path/golang 1.2 数据库索引…

【软件测试】测试框架(unittest/pytest)

本文介绍了Python 中最常用的两个测试框架&#xff1a;unittest 和 pytest&#xff0c;帮助你编写更规范、可维护的自动化测试用例。 一、unittest 框架 unittest 是 Python 内置的标准库&#xff0c;无需额外安装&#xff0c;适合初学者入门。它借鉴了 JUnit 的设计理念&…

麒麟信安安装谷歌浏览器

参考文档 麒麟信安系统Chrome离线安装包&#xff1a;高效便捷的浏览器解决方案-CSDN博客 项目文件预览 - 麒麟信安系统Chrome离线安装包:本仓库提供了一个适用于麒麟信安系统的Chrome浏览器离线安装包。该安装包包含了所有必要的依赖文件&#xff0c;并且已经对系统中已有的依…

Wireshark 使用教程:让抓包不再神秘

一、什么是 tshark&#xff1f; tshark 是 Wireshark 的命令行版本&#xff0c;支持几乎所有 Wireshark 的核心功能。它可以用来&#xff1a; 抓包并保存为 pcap 文件 实时显示数据包信息 提取指定字段进行分析 配合 shell 脚本完成自动化任务 二、安装与验证 Kali Linux…