简单的方法理解MySQL Group Commit原理
一个摆渡将乘客从A点传输到B点
MySQL 5.0 行为
在MySQL 5.0中,摆渡会在A点按顺序搭载乘客,并且传送到B点。A点和B点的来回行程大约需要10min时间,因此在摆渡过程中一些乘客已经到达A点。这样,在摆渡返回A点后,只会按顺序搭载下一个乘客,其他的都在排队等待中。
MySQL 5.6 行为
在MySQL 5.6中,摆渡将会搭载A点队列里的所有乘客,并且传送他们到B点。每一次摆渡返回A点搭载乘客时,他会统计所有在等待的人,把他们传送到B点。
在现实情况下,当有很多乘客等待的时性能是比较好的。
在5.6中,group commit是默认的。
MySQL 5.7 行为
在MySQL 5.7中的行为和5.6类似,会搭载所有A点等待的乘客,并且传送到B点。但有很明显的性能提升!
当摆渡返回A点,搭载等待乘客时,可以配置等待一小会,以便新的乘客到达。
例如:如果知道A和B点的往返行程时间是10min,出发前在A点为什么不多等待30s呢?这或许能节省摆渡的往返次数,提升能够传送乘客的总数量。
相关配置是:
binlog-group-commit-sync-delay 微妙延迟
binlog-group-commit-sync-no-delay-count 停止等待前的等待事务数
总结
很明显乘客就是事务,摆渡就是昂贵的fsync操作。很重要一点是只有一次摆渡操作,一系列有序的二进制日志。