MySQL主从同步中大事务导致的延迟_如何拆分大事务优化同步

大事务导致从库延迟飙升,因单线程SQL Thread串行回放ROW格式长事务;应分批UPDATE(LIMIT+游标)、避免子查询、用GTID差值等精准监控延迟。大事务为什么让从库延迟飙升主库一个 UPDATE 改 50 万行,binlog 里就是一条长事务日志;从库只能串行回放------不是它不想快,是 MySQL 的复制线程(SQL Thread)默认单线程重放,卡在这条事务上,后面所有日志都得排队。你看到的 Seconds_Behind_Master 突然跳到几千秒,往往就源于此。常见错误现象:SHOW SLAVE STATUS 里 Seconds_Behind_Master 持续上涨、Exec_Master_Log_Pos 几乎不动、Slave_SQL_Running_State 停在 executing event;同时主库 SHOW PROCESSLIST 早结束了,但从库 SHOW PROCESSLIST 还卡着一条 Update_rows_log_event 或 Query_log_event。关键点:不是数据量大就一定慢,而是「单个事务内修改行数多 + 行锁时间长 + binlog 格式为 ROW」三者叠加,最容易触发同步瓶颈。怎么拆?用 LIMIT + WHERE 分批提交,别信 OFFSET直接 UPDATE ... LIMIT 1000 是最常用也最稳妥的拆法,但必须配合确定性排序和游标式推进,否则会漏行或重复。正确姿势:先加索引:确保 WHERE 条件字段有高效索引(比如 status = 'pending',且 status 上有索引)用自增主键或时间戳做游标:比如 WHERE id > 100000 AND status = 'pending' ORDER BY id LIMIT 1000,每次取完记录最大 id,下一轮从它开始每次执行后显式 COMMIT,确保每个分片是独立事务绝对不用 LIMIT 1000 OFFSET 10000:OFFSET 越大越慢,且并发时可能跳过或重复示例片段(伪代码):SET @last_id = 0;WHILE (SELECT COUNT(*) FROM orders WHERE id > @last_id AND status = 'pending') > 0 DO UPDATE orders SET status = 'processed' WHERE id > @last_id AND status = 'pending' ORDER BY id LIMIT 1000; SELECT @last_id := MAX(id) FROM orders WHERE id > @last_id AND status = 'processed' LIMIT 1; COMMIT;END WHILE;ROW 格式下避免全表 UPDATE,尤其带子查询ROW 格式 binlog 会记录每一行变更前后的镜像,如果 UPDATE t1 SET a=(SELECT b FROM t2 WHERE t2.id=t1.id) 扫了 10 万行,binlog 就写 10 万条 Update_rows_log_event,体积暴涨,网络传输+解析都变慢。 AI智研社 AI智研社是一个专注于人工智能领域的综合性平台

相关推荐
默_笙3 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
qq_426003963 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技3 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
此时不提桶,更待何时3 天前
01-06-A-JVM排查实战详解
java·jvm
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
这个DBA有点耶3 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
DBA_G3 天前
从地面到云霄:GBase数据库在民航三大场景的落地实践
数据库
自由能燃气设备3 天前
商用全预混低氮冷凝锅炉免费方案vs付费方案对比+选型避坑指南
大数据·数据库·人工智能
只睡四小时3 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas