博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[MySQL5.6] 最近对group commit的小优化
阅读量:5161 次
发布时间:2019-06-13

本文共 1193 字,大约阅读时间需要 3 分钟。

[MySQL5.6] 最近对group commit的小优化

最近花了一些时间在做MySQL Group Commit的优化,关于Group commit的原理,这里不再赘述,有兴趣的可以翻阅我之前的博客 http://mysqllover.com/?p=581,这里简单描述下两点优化,主要基于MySQL5.6.16

1.优化binlog_order_commits=0并且sync_binlog>0时的性能 

我们知道当binlog_order_commits关闭时,表示我们能接受binlog commit和innodb commit的顺序不同(这不会带来数据不一致,但可能会影响到热备份),关闭该选项可以带来一定程度的性能提升。

本优化也是基于该前提,假定sync_binlog =1000, 那么在第1000组事务进入sync stage时,需要去做binlog sync,我们知道fsync操作是非常慢且耗时的操作,而第1001组事务,显然无需去做sync,如果我们允许innodb/binlog commit失序,就可以让第1001组事务跳过sync stage,直接进入innodb commit

detail见 http://bugs.mysql.com/bug.php?id=73018 ,附加补丁

2.延迟写redo直到group commit时来提升性能

我们知道MySQL使用Binlog,Innodb XA的方式来进行crash recovery,所有记录在binlog中的事务我们都期望能够commit掉; 这意味着,在写binlog之前,需要确保事务的prepare状态被写到redo中,这样才能从crash中恢复.

原生的逻辑中,各个事务各自做innodb prepare, 并写redo log; 只有到了commit阶段,进入ordered_commit,才进入组提交;

我们主要集中在group commit的第一阶段:flush stage。 在该阶段,leader线程从队列中pop 线程加入queue,并依次flush thread cache到binlog文件.

修改后的流程: 1. 在Innodb prepare阶段不再write/sync redo log,而是直接返回

2.在group commit的flush stage阶段,修改成如下逻辑

a) 收集组提交队列

b) 调用ha_flush_logs 做一次redo write/sync

c) 将队列中thd的所有binlog cache写到binlog文件中

detail见 http://bugs.mysql.com/bug.php?id=73202 , 附加补丁

转载于:https://www.cnblogs.com/MYSQLZOUQI/p/3850605.html

你可能感兴趣的文章
指定gpu
查看>>
TestNG Assert 详解
查看>>
【noip2004】 不高兴的津津 - 模拟
查看>>
Linux:tr命令详解
查看>>
C++ seekp 函数文件流跳转功能产生数据覆盖问题解决
查看>>
nRF51822 配置超过4个的 按键驱动
查看>>
C# Task,new Task().Start(),Task.Run();TTask.Factory.StartNew
查看>>
WebForms.LocalReport.SetParameters hangs
查看>>
django的数据库配置-13
查看>>
函数声明 函数表达式 通俗解释
查看>>
Oracle OCP 学习日志-使用转换函数和条件表达式-04
查看>>
C#:几种数据库的大数据批量插入(转)
查看>>
hdu 2196 computer 树状dp
查看>>
启用Servlet 3.0新特性——注解支持
查看>>
Python 类型的分类
查看>>
Stripies(POJ 1862 贪心)
查看>>
A Simple Math Problem(HDU 1757 构造矩阵)
查看>>
Eclipse使用External Tools定位class文件目录路径
查看>>
JS节流和防抖
查看>>
C#教程之打印和打印预览
查看>>