innoDB - 我应该关闭innodb_flush_log_at_trx_commit吗?

时间:2012-11-07 22:54:43

标签: mysql sql innodb

我有一个包含数千行的数据库表。输入新行或更新行需要一点时间。要进行50次更新(格式为update table set field = 1234 where id = 5678; update table set field = 912 where id = 582; ...),可能需要4或5秒。

我怎样才能减少这段时间?是否值得玩innodb_flush_log_at_trx_commit设置?如何为某些连接/查询设置该设置?

innodb_flush_log_at_trx_commit一起玩是否安全?数据并不重要,只要一个副本(在UPDATE命令之前或之后)是完整的(它只是设置一些有点随机的数据更新......在这些查询中没有重要的数据被更改)

此表上的大部分查询都是SELECT,这就是我使用innodb的原因。

感谢

1 个答案:

答案 0 :(得分:3)

是的,更改innodb_flush_log_at_trx_commit是安全的。将其从1(默认值)更改为0或2的效果是日志写入将发生大约每秒一次而不是每次提交一次。换句话说,现在你的50个更新导致50个fsyncs(假设你正在使用自动提交)。您可以将其更改为每秒1个fsync。

但是你也可以通过 not 使用autocommit获得类似的效果,而是在显式事务中包装50个更新:

  1. 启动事务,暂时禁用自动提交。
  2. 运行50次更新。
  3. 提交。
  4. 这将在提交时产生1个fsync(加上每秒1个fsync,无论配置如何,总是这样做)。这可能足以提高您的吞吐量。

    所有这一切,我不认为50 fsyncs在任何系统上需要5秒,除非你有非常糟糕的硬盘驱动器或服务器也装载了很多其他流量。

    您还应该确保更新从索引中受益。我可以假设id是表的主键,因此它是聚簇索引。但我想确认一下。您可以运行SHOW CREATE TABLE <tablename>并在上面的问题编辑中发布输出吗?