Mysql 许多个人的疑问。一个大的

Mysql 许多个人的疑问。一个大的,mysql,database,performance,database-performance,Mysql,Database,Performance,Database Performance,我所处的情况是,表中的整列(用于用户令牌)需要擦除,即所有用户令牌同时重置。有两种方法:使用单独的更新查询分别重置每个用户的令牌;或者进行一个影响所有行的大查询 一个大查询的优点是它显然会快得多,但我担心当数据库很大时,一个大的更新查询会带来什么影响。查询期间发生的请求是否会受到影响?答案取决于您建立的事务和隔离级别 您可以将隔离设置为允许“脏读”、“幻象读”或强制读写序列化 无论您如何进行更新,您都希望它是一个单一的工作单元 我建议最小化网络延迟,并在一次网络往返中更新所有用户令牌。这意味着要

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


一个大查询的优点是它显然会快得多,但我担心当数据库很大时,一个大的更新查询会带来什么影响。查询期间发生的请求是否会受到影响?

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

您可以将隔离设置为允许“脏读”、“幻象读”或强制读写序列化

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


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

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

  • 更新一列的长时间运行事务将有效阻止其他插入、更新和删除事务
  • 长时间运行的事务会导致磁盘上的enourmous负载,因为服务器必须将正在发生的一切写入日志文件,以便您可以回滚那个巨大的事务
  • 如果事务失败,您必须完全重新运行它,因为它不可重新启动
所以,若同时的需求可以解释为“在一个批中运行可能需要一段时间”,我会选择批处理它。关于MySql中删除性能的一篇好的研究报告如下:,我认为大多数发现都适用于更新

诀窍在于找到最佳的“批量大小”


批处理的另一个好处是,您可以使此过程具有故障恢复能力,并且可以友好地重新启动。

批处理……比如说,一次10000行。。。。