【发布时间】:2021-08-30 08:21:28
【问题描述】:
- 假设有一个包含 1M 行的表,其类别为 1-100。
- 我需要更新 f.e. category=10(假设有 150k 行)。
- 我将更新 120k 行,需要删除 30k 行。
第一个想法: 目前我正在使用开始将所有行更新为 0,并在更新时将此值更改为 1。然后删除 category=10 和 update=0 的所有行。
在 category=10 的情况下,将 150k 行更新为 0 时存在性能问题。有时需要 30 秒,因为可能有 200k 行,而不仅仅是 30k。
第二个想法 一开始,循环所有 150k 行以将 id 保留在数组中,然后用更新的 id 填充一个新数组,最后使用 array_diff 删除剩余的 id。
使 sql 类似于“... where id in (...30k ids...)”的性能也存在问题。
你们使用更好的方法来解决这项工作吗? 谢谢。
【问题讨论】:
-
不明白,如果您能够更新符合条件的行( WHERE ...)您应该能够使用否定的 crtiria 删除(WHER NOT (...) )
-
@Dri372 不。想象一下,有 100 万个产品的提要。那些不再在提要中的应该被删除。我不知道他们是谁,有多少人。我正在循环交叉提要并更新提要中的产品。其他所有内容都需要从 db 中删除。
-
@Dri372 我可以使用“WHERE NOT IN (...)”之类的查询,但 ID 约为 150k?需要为这个问题制定一些最聪明的解决方案。