我有一个包含大约10000个条目的大型高流量表,我需要一个命令来清除除了顶部(最高ID )n个条目以外的所有条目。
我想要这样的东西,但它导致语法错误:
ALTER TABLE table
PARTITION BY RANGE(id)(
PARTITION p0 VALUES LESS THAN (MAX(id)-n),
PARTITION p1 VALUES LESS THAN (MAXVALUE));
ALTER TABLE table DROP PARTITION p0;
唯一的问题是我需要清除除了顶部值之外的所有值,堆叠分区不起作用。此外,调度程序不适合我正在做的事情。 如何有效地删除Mysql表中除n个最高id行之外的所有行?
答案 0 :(得分:1)
您可以使用以下内容:
DELETE
FROM ids
WHERE id NOT IN (select * from (select id from ids order by id desc limit 2) s)
请参阅小提琴here。
或者这个:
DELETE ids.*
FROM
ids LEFT JOIN (select id from ids order by id desc limit 2) s
ON ids.id = s.id
WHERE s.id is null
小提琴here。
答案 1 :(得分:1)
如果您想有效地执行此操作,请将行复制到另一个表中,截断原始表,然后重新插入行。
create temporary table tosave as
(select *
from mytable
order by id desc
limit n
);
truncate table mytable;
insert into mytable
select * from tosave
truncate
效率更高,因为它不记录删除(如here所述)。
答案 2 :(得分:0)
我会这样做:
delete from `table`
where `key` not in (select `key` from `table` order by <...> limit n,100000)