mysql - 删除剩余行MySql
问题描述
- 想象一下,有一个表有 1M 行,类别为 1-100。
- 我需要更新 fe category=10 的行(假设有 150k 行)。
- 我将更新 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...)”之类的性能也存在问题。
你们用更好的东西来解决这项工作吗?谢谢。
解决方案
您的第一个想法的变化:将您的标志列定义为时间戳而不是布尔值,然后您不必花费 30 秒将其初始化为 0。只需在更新行时将该时间戳更新为 NOW()。完成后,应删除标志列早于您的第一个更新行的任何行。我假设此更新/删除任务将定期再次完成,但只要任务不重叠,时间戳应该仍然有效。
你的第二个想法的变化:不要运行查询DELETE FROM imagine WHERE id IN(...30k ids...)
谓词。相反,您可以运行一系列DELETE FROM imagine WHERE id IN (...100 ids...)
. 循环遍历您的 id 列表并一次删除 100 个。您需要以这种方式运行 300 个 DELETE 语句,但编写循环很容易。
推荐阅读
- python - 找到 N*N 矩阵的最大成本路径,从 [0,0] 到 [N-1,N-1],在一个方向上具有偏好
- java - 我无法从 Json 数组中获取数据
- python - django中的图片上传问题
- c++ - 从模板参数派生的类
- bash - 如何将大型 PDF 文件页面拆分为每页单独的新 PDF 文件?
- r - R data.table 通过返回新表的组的动态列名
- c# - 开关情况下的 Resharper 警告“源表达式始终与提供的模式匹配”
- javascript - Primevue 日历未在我的 vue 应用程序中显示图标
- ios - 在 tvOS/iOS 的 AVplayers 中缓冲和预加载视频
- laravel - Laravel 新模型缺少 created_at 和 updated_at 字段