← 每日面试题 学习看板

介绍下MySQL 5.7中的组提交?

面试题/03数据库中间件/01MySQL/05事务与锁机制/介绍下MySQL 5.7中的组提交?.md

面试记录 2026-09-17

题目:介绍下 MySQL 5.7 中的组提交

难度:medium

标签:db/mysql/transaction, mysql/optimization, difficulty/medium

评分:⭐⭐☆☆(2/5)

我的回答

主提交方面我理解不深,但是按我的理解,主提交基本上就类似于批量的提升效率的功能。按照正常的批量操作策略来说,应该是预提交,然后验证或者执行,然后最后是提交 commit,中间出问题可能会涉及回滚或者是部分提交类似的情况。主提交这种东西基本上是批量操作,就是提升效率,提升,降低刷盘,降低 IO,然后提升单次效率。

点评

优点:

不足:

补充:

完整讲解

第一部分:知识重点剖析

核心考点定位:理解 MySQL 5.7 binlog 组提交的三阶段模型与 fsync 合并优化,掌握其在双写(binlog + redo)场景下的收益。

知识点拆解:

  1. 背景:为什么需要组提交
  1. 什么是组提交
  1. binlog 组提交的三阶段模型
  1. Group Leader 机制(5.7 新特性)
  1. redo log 组提交
  1. 5.7 的关键优化:联合提交
  1. 性能影响

第二部分:考察方向与延伸递进

考察方向:

延伸递进面试题:

  1. binlog 组提交的 Commit 阶段和 InnoDB 的 2PC 有什么关系?
  1. sync_binlog=1 和 innodb_flush_log_at_trx_commit=1 都能保证零丢失吗?
  1. MySQL 8.0 对组提交有哪些优化?

第三部分:面试者参考回答(口语化)

面试官您好,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