1

我处于需要擦除表中的整个列(用于用户令牌)的情况,即同时重置所有用户令牌。有两种方法:使用单独的 UPDATE 查询单独重置每个用户的令牌;或进行一个影响所有行的大查询。

一个大查询的优点是它显然会快得多,但我担心当数据库很大时大型 UPDATE 查询的影响。查询期间发生的请求会受到影响吗?

4

2 回答 2

1

答案取决于您建立的事务和隔离级别。

您可以设置隔离以允许“脏读”、“幻读”或强制序列化读取和写入。

无论您如何进行更新,您都希望它成为一个单一的工作单元。

我建议尽量减少网络延迟并在一次网络往返中更新所有用户令牌。这意味着要么编写单个查询,要么将多个查询批处理到一个请求中。

于 2012-11-22T03:22:20.900 回答
1

恐怕没那么简单。即使启用脏读,运行一个大更新也有很多缺点:

  • 更新一列的长时间运行的事务将有效地阻止其他插入、更新和删除事务。
  • 长时间运行的事务会导致磁盘上的巨大负载,因为服务器必须将正在发生的所有事情都写入日志文件,以便您可以回滚那个巨大的事务。
  • 如果事务失败,您将不得不完全重新运行它,它是不可重新启动的。

因此,如果同时要求可以解释为“可能需要一段时间才能运行的批处理”,我会选择批处理。一篇关于 MySql 中 DELETE 性能的很好的研究文章在这里:http: //mysql.rjweb.org/doc.php/deletebig,我认为大多数发现都适用于 UPDATE。

诀窍将是找到最佳的“批量大小”。

批处理的额外好处是您可以使此过程对故障具有弹性并且对重新启动友好。

于 2012-11-22T04:14:44.720 回答