根本原因是slave_parallel_type默认为database,仅跨库写入才并行;若业务集中单库,即使设slave_parallel_workers=16也仅1线程工作,须改logical_clock并配主库组提交或writeset。

slave_parallel_workers 设了但延迟没降?大概率是没配对模式,或者主库根本没发可并行的事务。
为什么 slave_parallel_workers 开了却还是单线程回放?
MySQL 5.7+ 默认启用的是 slave_parallel_type = DATABASE(库级并行),但这个模式只在**跨多个数据库(schema)写入**时才真正并行。如果所有业务表都在同一个库(比如 order_db),哪怕你设了 slave_parallel_workers = 16,SQL 线程也只会用 1 个——其余 15 个全程空闲。
- 检查当前模式:
SHOW VARIABLES LIKE 'slave_parallel_type';,若返回DATABASE,就踩坑了 - 确认写入分布:
SELECT COUNT(DISTINCT table_schema) FROM information_schema.tables WHERE table_schema NOT IN ('mysql','information_schema','performance_schema','sys');,结果为 1 就别指望 DATABASE 模式有效 - 主库
binlog_format必须是ROW;MIXED或STATEMENT下LOGICAL_CLOCK和WRITESET都不生效
slave_parallel_type = LOGICAL_CLOCK 怎么配才起作用?
这是 MySQL 5.7–8.0.18 最通用的并行方案,依赖主库的组提交(group commit)信息,不强制要求多库,只要主库并发事务能打散成多个组,从库就能分发给不同 worker 线程。
- 主库必须开启组提交:
binlog_group_commit_sync_delay > 0(如 100 微秒) +binlog_group_commit_sync_no_delay_count >= 10 - 从库关键三步(需停复制):
STOP SLAVE;→SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK';→SET GLOBAL slave_parallel_workers = 4;→START SLAVE; - 必须配
slave_preserve_commit_order = 1,否则跨线程事务提交顺序错乱,主从数据可能不一致 - 验证是否生效:
SHOW PROCESSLIST;查看是否有多个system user线程状态为Waiting for an event from Coordinator
MySQL 8.0.19+ 用 WRITESET 能不能突破单库瓶颈?
可以,但前提是主库也要配合——它不是光改从库参数就能开的“开关”。WRITESET 通过哈希事务修改的行集合(write set)来判断事务间无依赖,从而允许并行。但主库不生成 write set,从库就收不到依赖信息。
- 主库执行:
SET GLOBAL binlog_transaction_dependency_tracking = WRITESET;+SET GLOBAL transaction_write_set_extraction = XXHASH64; - 从库执行:
SET GLOBAL slave_parallel_type = 'LOGICAL_CLOCK';(注意:不是WRITESET,MySQL 不支持该值) +slave_parallel_workers调高(如 8–16) - 必须调大
binlog_transaction_dependency_history_size(默认 25000),否则历史依赖记录被清空,worker 会退化为保守串行 - 效果取决于事务粒度:单事务更新 500 行,write set 哈希冲突概率上升,反而降低并行度;拆成多个小事务才能真正释放并发能力
调高 slave_parallel_workers 后性能反而下降?
线程数不是越多越好。worker 过多会加剧锁争用(比如 innodb_buffer_pool、dict_table_t 元数据锁)、上下文切换开销,尤其当从库 CPU 核心少于 8 时,设到 16 常见反效果。
- 合理范围:4–8(OLTP 场景),上限建议 ≤ 从库物理 CPU 核心数 × 2(扣除 mysqld 自身和其他服务占用)
- 先看负载分布:
top -H -p $(pgrep mysqld),如果只有 2 个线程 CPU 占用 95%,其余长期 UPDATE 缺索引) -
Relay_Log_Space持续增长?说明 IO 线程或网络拖后腿,再调 worker 也没用;Read_Master_Log_Pos和Exec_Master_Log_Pos差值大?SQL 线程才是瓶颈
slave_parallel_workers,先确认 binlog_format、slave_parallel_type、主库组提交或 write set 配置这三块是否闭环。











