题目:介绍下 MySQL 5.7 中的组提交
难度:medium
标签:db/mysql/transaction, mysql/optimization, difficulty/medium
评分:⭐⭐☆☆(2/5)
主提交方面我理解不深,但是按我的理解,主提交基本上就类似于批量的提升效率的功能。按照正常的批量操作策略来说,应该是预提交,然后验证或者执行,然后最后是提交 commit,中间出问题可能会涉及回滚或者是部分提交类似的情况。主提交这种东西基本上是批量操作,就是提升效率,提升,降低刷盘,降低 IO,然后提升单次效率。
优点:
不足:
sync_binlog、innodb_flush_log_at_trx_commit补充:
sync_binlog=1(每次都刷 binlog)、innodb_flush_log_at_trx_commit=1(每次都刷 redo),这是"双 1 配置",性能 vs 一致性权衡sync_binlog=1000 或 =0 时性能提升明显但可能丢事务核心考点定位:理解 MySQL 5.7 binlog 组提交的三阶段模型与 fsync 合并优化,掌握其在双写(binlog + redo)场景下的收益。
知识点拆解:
innodb_flush_log_at_trx_commit:1=每次 commit fsync,0=每秒 fsync(可能丢 1 秒数据),2=写 OS cache 不 fsync(MySQL 崩溃不丢,系统崩溃可能丢)sync_binlog=1(默认,最安全)+ 组提交:每组 fsync 一次 binlogsync_binlog=1000:每 1000 个事务 fsync 一次 binlog,崩溃最多丢 1000 个事务sync_binlog=0:由 OS 决定 fsync 时机,最快但可能丢大量数据考察方向:
sync_binlog 与 innodb_flush_log_at_trx_commit延伸递进面试题:
sync_binlog=1 和 innodb_flush_log_at_trx_commit=1 都能保证零丢失吗?O_DIRECT + fdatasync。binlog_transaction_compression 等。面试官您好,MySQL 5.7 的组提交,主要是解决高并发下事务提交时 binlog 和 redo log 频繁 fsync 的性能瓶颈。要理解组提交,先要理解一个事务提交要经过什么。
在双 1 配置下(sync_binlog=1 + innodb_flush_log_at_trx_commit=1),单个事务提交最少需要 2 次 fsync:一次刷 binlog,一次刷 redo log。fsync 是磁盘 IO 的瓶颈,一次可能几毫秒,高并发下每秒几千个事务就要几千次 fsync,直接把磁盘打爆。组提交就是把多个事务"打包"起来,一次 fsync 覆盖多个事务。
binlog 组提交分三个阶段:
Flush 阶段:每个事务把 binlog 从 MySQL 自己的 page cache 刷到 OS cache。这一步是顺序写,很快,每个事务独立进行,不需要排队。
Sync 阶段:关键的一步。事务进入这个阶段后要排队,由一个事务当 Group Leader 代表整组事务做 fsync,把 binlog 从 OS cache 刷到磁盘。其他事务作为 Group Follower 等待。这里组越大,fsync 成本被平摊得越薄。
Commit 阶段:Leader fsync 完成后,通知所有 Follower 一起更新 binlog 状态。同时这一步会触发 InnoDB 的 redo log 提交——binlog 的 Commit 阶段和 InnoDB 的 redo 组提交在这里联动,相当于 2PC 增强版:binlog 和 redo 一起提交,一次 fsync 完成两件事。
MySQL 5.7 的 Group Leader 机制引入了多个 Group Leader 交替工作,允许组之间的并行度更高,减少了组与组之间的阻塞。
为什么要这么麻烦:因为 fsync 慢,但事务提交不能丢 binlog 或 redo,只能靠组提交把 fsync 次数从"每事务 2 次"降到"每组 2 次",性能可以从几百 TPS 提升到几千甚至上万 TPS。
参数选择:sync_binlog=1 是最安全的配置,崩溃不丢;sync_binlog=1000 是每 1000 个事务 fsync 一次,能提升性能但可能丢最多 1000 个事务;sync_binlog=0 交给 OS 决定,最快但可能丢大量数据。生产上通常是双 1 配置保安全,靠组提交拿性能,牺牲一点 CPU 换取数据可靠。
https://chat.deepseek.com/share/dsrk0ch0l2279ncpir