我有一个包含数百行或数千行的数据库表。输入新行或更新行需要一点时间。要执行 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 个更新包装在显式事务中:
- 启动一个事务,这会暂时禁用自动提交。
- 运行 50 次更新。
- 提交。
这将导致提交时 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/