大事务导致从库延迟飙升,因单线程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智研社是一个专注于人工智能领域的综合性平台
相关推荐
szccyw01 小时前
mysql如何限制特定存储过程执行权限_MySQL存储过程安全访问小白学大数据1 小时前
Python 自动化爬取网易云音乐歌手歌词实战教程czlczl200209252 小时前
利用“延迟关联”优化 MySQL 巨量数据的深分页查询ACP广源盛139246256732 小时前
IX8024与科学大模型的碰撞@ACP#筑牢科研 AI 算力高速枢纽分享Elastic 中国社区官方博客2 小时前
ES|QL METRICS_INFO 和 TS_INFO:为你的时间序列数据建立目录俺不要写代码3 小时前
数据库:函数风之所往_3 小时前
Python 3.0 新特性全面总结2401_882273723 小时前
如何在 CSS 中正确加载本地 JPG 背景图片Lucas_coding3 小时前
【Claude Code Router】 Claude Code 兼容 OpenAI 格式 API, Claude code 接入本地部署模型