2

我有一个有 100 万行的数据库表。输入新行或更新行需要一点时间。要进行 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 的原因。

谢谢

4

1 回答 1

3

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

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

  1. 启动一个事务,它会暂时禁用自动提交。
  2. 运行 50 次更新。
  3. 犯罪。

这将导致在提交时进行 1 次 fsync(加上每秒 1 次 fsync,无论配置如何)。这可能足以提高您的吞吐量。

综上所述,我认为 50 个 fsync 在任何系统上都不需要 5 秒,除非您的硬盘驱动器非常糟糕,或者服务器还加载了很多其他流量。

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

于 2012-11-08T01:51:21.530 回答