许多个人查询与一个大一个

时间:2012-11-22 03:16:04

标签: mysql database performance database-performance

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

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

2 个答案:

答案 0 :(得分:1)

答案取决于您已建立的交易和隔离级别。

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

但是你做了更新,你会希望它只是一个工作单元。

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

答案 1 :(得分:1)

害怕它不是那么简单。即使你启用脏读,运行一个大的更新也有很多缺点:

  • 更新一列的长时间运行事务将有效阻止其他插入,更新和删除事务。
  • 长时间运行的事务会导致极大加载到磁盘上,因为服务器必须将正在发生的所有内容写入日志文件,以便您可以回滚该巨大的事务。
  • 如果事务失败,则必须完全重新运行,不能重新启动。

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

技巧将是找到最佳的“批量大小”。

添加批处理的好处是,您可以使此过程适应故障并重新启用友好型。