3

我有一个包含大约 10000 个条目的大型高流量表,我需要一个命令来清除除顶部(最高 ids)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 行之外的所有行?

4

3 回答 3

2

如果您想有效地执行此操作,请将行复制到另一个表中,截断原始表,然后将行重新插入。

create temporary table tosave as
    (select *
     from mytable
     order by id desc
     limit n
    );

truncate table mytable;

insert into mytable
    select * from tosave

truncate效率更高,因为它不记录删除(如此处所述)。

于 2013-03-07T00:24:23.387 回答
1

你可以使用这样的东西:

DELETE
FROM ids
WHERE id NOT IN (select * from (select id from ids order by id desc limit 2) s)

在此处查看小提琴。

或者这个:

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

在这里拉小提琴。

于 2013-03-06T22:32:02.130 回答
0

我会这样做:

delete from `table`
where `key` not in (select `key` from `table` order by <...> limit n,100000)
于 2013-03-06T22:05:55.297 回答