我处于需要擦除表中的整个列(用于用户令牌)的情况,即,同时重置所有用户令牌。有两种方法:使用单独的UPDATE查询单独重置每个用户的令牌;或者制作一个影响所有行的大查询。
一个大问题的优点是它显然会快得多,但是当数据库很大时我担心大型UPDATE查询的含义。查询期间发生的请求会受到影响吗?
答案 0 :(得分:1)
答案取决于您已建立的交易和隔离级别。
您可以设置隔离以允许“脏读”,“幻读”或强制读写序列化。
但是你做了更新,你会希望它只是一个工作单元。
我建议最小化网络延迟并在一次网络往返中更新所有用户令牌。这意味着要么编写单个查询,要么将多个查询批处理为一个请求。
答案 1 :(得分:1)
害怕它不是那么简单。即使你启用脏读,运行一个大的更新也有很多缺点:
因此,如果同时要求可以解释为“在一个批次中可能需要一段时间才能运行”,我会选择对其进行批处理。关于MySql中DELETE的性能的一篇很好的研究报告在这里:http://mysql.rjweb.org/doc.php/deletebig,我认为大多数研究结果适用于UPDATE。
技巧将是找到最佳的“批量大小”。
添加批处理的好处是,您可以使此过程适应故障并重新启用友好型。