首页 > 解决方案 > 删除剩余行MySql

问题描述

  1. 想象一下,有一个表有 1M 行,类别为 1-100。
  2. 我需要更新 fe category=10 的行(假设有 150k 行)。
  3. 我将更新 120k 行并需要删除 30k 行。

第一个想法: 目前我正在使用开始将所有行更新为 0,并在更新时将此值更改为 1。然后删除 category=10 和 update=0 的所有行。

将 150k 行更新为 0(其中 category=10)时存在性能问题。有时需要 30 秒,因为可能有 200k 行,而不仅仅是 30k。

第二个想法 一开始,循环所有 150k 行以将 id 保留在数组中,然后用更新的 id 填充一个新数组,最后使用 array_diff 删除剩余的 id。

使 sql 像“... where id in (...30k ids...)”之类的性能也存在问题。

你们用更好的东西来解决这项工作吗?谢谢。

标签: mysqlloopsupdates

解决方案


您的第一个想法的变化:将您的标志列定义为时间戳而不是布尔值,然后您不必花费 30 秒将其初始化为 0。只需在更新行时将该时间戳更新为 NOW()。完成后,应删除标志列早于您的第一个更新行的任何行。我假设此更新/删除任务将定期再次完成,但只要任务不重叠,时间戳应该仍然有效。

你的第二个想法的变化:不要运行查询DELETE FROM imagine WHERE id IN(...30k ids...)谓词。相反,您可以运行一系列DELETE FROM imagine WHERE id IN (...100 ids...). 循环遍历您的 id 列表并一次删除 100 个。您需要以这种方式运行 300 个 DELETE 语句,但编写循环很容易。


推荐阅读