3

約 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 テーブルの最大 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 に答える