

新闻资讯
技术学院MySQL通过Redo日志刷盘策略(innodb_flush_log_at_trx_commit=0/1/2)控制持久性与性能平衡,结合Group Commit机制将多个事务的fsync批量执行,显著降低IO开销;开启binlog时,通过二阶段提交与Binlog Group Commit保障一致性并进一步优化IO效率。
MySQL 的 Redo 日志刷盘策略和 Group Commit 是保障事务持久性与提升并发性能的一体两面:前者决定“什么时候写磁盘”,后者解决“怎么更高效地写磁盘”。核心逻辑很直接——单个事务刷一次盘太慢,多个事务凑一起刷,摊薄 IO 成本。
关键参数是 innodb_flush_log_at_trx_commit,它控制事务提交时 redo log 的落盘行为:
fsync() 强制刷到磁盘文件(ib_logfile*)。满足 ACID 中的 Durability,但每笔事务都触发一次磁盘 IO,高并发下易成瓶颈。即使设置为 innodb_flush_log_at_trx_commit = 1,MySQL 也不会让每个事务独自排队等磁盘。它通过 Group Commit 将多个事务的 redo log 刷盘动作“打包”执行:
取全局 log sys mutex,但实际并不长期持有;而是快速登记自己要刷的 LSN 范围,加入等待队列。fsync(),完成后再统一唤醒其余事务。这样 10 个事务原本需 10 次 fsync,现在只需 1 次。当开启 binlog(如主从复制场景),MySQL 必须保证 redo 和 binlog 一致性,否则 crash 后可能造成主从数据不一致。为此采用:
Group Commit 不是开关型功能,而是在 innodb_flush_log_at_trx_commit = 1 下自动生效的底层机制。它的收益取决于并发事务密度:
innodb_log_buffer_size(默认 16MB)和 innodb_log_file_size,避免频繁触发 buffer 满而提前刷盘,干扰 Group Commit 的聚合效果。