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 万行。
我有一个没有时间戳字段的臃肿 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 万行。