有效地删除Mysql表中除前n行之外的所有行

时间:2013-03-06 21:58:57

标签: mysql

我有一个包含大约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行之外的所有行?

3 个答案:

答案 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)