mysql innodb_flush_log_at_trx_commit

参数  innodb_flush_log_at_trx_commit用来控制重做日志刷新到磁盘的策略。该参数的默认值是1,表示事务提交时必须调用一次fsync操作。还可以设置该参数的值为0和2。

0表示事务提交时不进行写入重做日志操作,这个操作仅仅在master thread中完成,而在mastert hread 中每1秒会进行一次重做日志文件的fsynccaozuo 。2表示事务提交时将重做日志写入重做日志文件,但仅写入文件系统的缓存中,不进行fsync操作。在这个设置下,当MySQL数据库发生泵机而操作系统不进行泵机的时候,并不会导致事务的丢失。


我们可以看看这个参数对于事务的影响和对数据库性能的影响。

我们先来创建一张表和一个存储过程


create table test_load(
  a int ,
  b char(80)
) ENGINE = innodb;


drop PROCEDURE if EXISTS p_load;
CREATE PROCEDURE p_load(count INT UNSIGNED)

  begin
    DECLARE s int UNSIGNED DEFAULT 1;
    DECLARE c CHAR(80) DEFAULT REPEAT('a', 80);

    WHILE s <= count do
    INSERT INTO test_load select null, c ;
      COMMIT ;
      set s = s+1 ;
      end while ;

  END;


CALL p_load(500000);
这里创建了一张表,以及向这张表中插入50w条数据的存储过程,并且调用他。

 innodb_flush_log_at_trx_commit参数的默认值是1,该值代表了每次向数据库提交事务都要向磁盘中写入日志。

设计到IO操作,所以在 innodb_flush_log_at_trx_commit=1的情况下性能不会很好。

当我们把值设置为0的时候,50w次的commit仅仅只会做一个日志的写入。

而且对于我们当前的应用,记录一次和记录50w次的日志效果是一样的。

不影响我们当前的业务场景。



而且读者可以将上述的例子拷贝到自己的本地数据库运行下,基本上都是分钟和秒的数量级之间的关系。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值