mysql - innoDB - 我应该关闭 innodb_flush_log_at_trx_commit 吗?

标签 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 的原因。

谢谢

最佳答案

是的,更改 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>并将输出发布到上面问题的编辑中?

关于mysql - innoDB - 我应该关闭 innodb_flush_log_at_trx_commit 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13279681/

相关文章:

MySQL 独占锁(FOR UPDATE)锁定整个表

php - 有条件地向远程站点提供 Logo

mysql - 列出收入高于经理的员工姓名

mysql - 使用子查询计算百分比

sql - 如何有效地反转多对多 SQL 查询?

mysql - 触发器不起作用,插入时插入另一个表时出错

MYSQL5.5 INNODB优化

mysql - SQL 查询按月/年统计总条目

mysql - 如何删除Mysql中的唯一约束?

mysql - 如何统计连接表记录