MySQL - 想要增量删除早于 x 行的任何内容

MySQL - Want to incrementally DELETE anything older than x amount of rows

我有一个没有时间戳字段的臃肿 table。因此,我想出的清理此 table 的最佳方法是保留最近的 7,000,000 行(相当于大约 1 年的数据)。

我一直在尝试的是使用 MAX(primary_id) - 7000000 并以 500 (LIMIT) 的增量删除比这更早的任何内容。

DELETE
FROM tblBloat
WHERE (Select MAX(primaryID) - 7000000 from tblBloat) > primaryID
ORDER BY primaryID desc
LIMIT 500

但是 returns 出现错误“您无法在 FROM 子句中指定目标 table 'tblBloat' 进行更新。

也试过这个,但是 mySQL 似乎不喜欢 DELETE 语句上的 JOIN:

DELETE 
FROM tblBloat
INNER JOIN (select MAX(primaryID) - 7000000 as 'max'
FROM tblBloat) ab
WHERE primaryID < ab.max
ORDER BY primaryID DESC
LIMIT 500

有什么想法吗?

获取需要删除的最高ID:

set @max_delete_id = (
  select primaryID
  from tblBloat
  order by primaryID desc
  limit 1
  offset 7000000
);

然后删除所有具有相同或更小 ID 的行:

delete
from tblBloat
where primaryID <= @max_delete_id
limit 500;

然后重复第二个查询,直到没有行受到影响。

我会使用更高的 LIMIT(可能是 10000)或跳过 LIMIT。

查询的一个常见解决方法是将子查询包装到 派生的 table(FROM 子句中的子查询):

DELETE
FROM tblBloat
WHERE (SELECT * FROM (Select MAX(primaryID) - 7000000 from tblBloat)x) > primaryID
ORDER BY primaryID desc
LIMIT 500

但请注意,primaryID 可能由于多种原因而存在间隙,您将保留少于 700 万行。