mysql innodb_flush_log_at_trx_commit

来源:互联网 发布:学python和java哪个好 编辑:程序博客网 时间:2024/05/17 22:31

参数  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次的日志效果是一样的。

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



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