MySQL 8.0主从复制延迟更低,核心是WRITESET行级并行机制绕过5.7组提交瓶颈:不依赖last_committed时间分组,而是基于主键/唯一键哈希生成write_set,从库通过集合交集判断冲突,无交集即并发执行,使同表不同行的事务(如相隔3分钟的UPDATE)也能并行。

MySQL 8.0 主从复制延迟更低,核心不是“整体更快”,而是 WRITESET 并行机制让 SQL 线程在真实业务场景下极少卡死——哪怕所有写入都集中在一张表、一个库,只要改的行不重叠,就能并行回放。
WRITESET 是怎么绕过 5.7 的组提交瓶颈的
MySQL 5.7 的 LOGICAL_CLOCK 并行依赖主库是否“凑组”:只有同一刷盘批次的事务才共享 last_committed 值,从库才分发给多个 worker。但现实里:
- 定时任务单条
UPDATE批量更新,last_committed几乎总是递增 → 串行回放 - 低峰期或单线程应用,事务间隔长 → 根本凑不成组,
Slave_SQL_Running_State长期卡在Waiting for an event from Coordinator - 两个事务明明改不同表、不同行,只因没进同一组,照样不能并行
MySQL 8.0 的 WRITESET 不看时间先后,只看行级冲突:每个事务在主库提交前,基于修改行的主键或唯一键计算哈希,生成 write_set(如 {hash(users:101), hash(orders:202)}),随 binlog 传到从库;从库用集合交集判断——无交集就并发执行。
这意味着:相隔 3 分钟提交的两个 UPDATE,只要改的是不同行,就能被调度进同一批 worker。
配置 WRITESET 必须对齐的三项关键参数
WRITESET 是主从协同机制,漏掉任意一项,SQL 线程仍串行回放,Seconds_Behind_Master 居高不下:
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
- 主库必须设
binlog_transaction_dependency_tracking = WRITESET(默认是COMMIT_ORDER,不设等于白配) - 主库
binlog_format必须为ROW(MIXED在部分场景 fallback 到STATEMENT,write_set就丢了) - 从库必须设
slave_parallel_type = LOGICAL_CLOCK(注意:不是WRITESET;WRITESET是 dependency tracking 模式,不是parallel_type)
常见错误是只改主库或只改从库。验证方式:查 SHOW PROCESSLIST,如果 Slave_SQL_Running_State 长时间停在 Waiting for an event from Coordinator,基本就是参数没对齐。
GTID + WRITESET 如何减少人工干预延迟
MySQL 8.0 强制推荐 gtid_mode = ON 且 enforce_gtid_consistency = ON。当 SQL 线程因唯一键冲突、表不存在等中断时:
- 旧版要手动解析 relay log 找 position,再执行
CHANGE MASTER TO RELAY_LOG_FILE=..., POS=...,耗时数分钟甚至小时 - 8.0 直接执行
SET GTID_NEXT = 'xxx-xxx-xxx:12345'; BEGIN; COMMIT;即可跳过单个事务,秒级恢复 - 重启后,
GTID_EXECUTED自动识别已执行事务,无需额外同步起点
但务必确认该事务在业务上可丢弃(比如幂等性操作失败)。误设 GTID_NEXT 可能导致数据不一致,建议跳过前先用 SELECT GTID_SUBSET() 校验。
最容易被忽略的是:WRITESET 的效果高度依赖主键/唯一键质量。如果表没有主键或唯一键,write_set 无法生成,事务自动退化为串行。别只盯着参数,先检查表结构。










