これはあなたの問題の解決策かもしれません。
ただし、日時列がないため、id列が主キーであると想定しています。そしてそれはAuto_increment
。したがって、私の仮定では、数値が大きいほど、レコードは新しいものになります。 (テーブルに古いデータダンプがない限り、これは正しいはずです)
削除する前に必ずデータをバックアップしてください。これにより、永続的なデータが失われます。さらに良いことに、現在のテーブルのコピーを別のテーブルに作成し、新しいテーブルで作業して、以下のロジックが正しいことを確認できます。次に、以下のクエリを変更して、tbl_new
から読み取ります。 代わりにtbl
次のような方法でテーブルを複製できます
CREATE TABLE tbl_new LIKE tbl;
すべてのクエリにコメントを残しました
DROP TEMPORARY TABLE IF EXISTS keepers1, keepers2, keepers_all;
-- get the #1 top records
CREATE TEMPORARY TABLE keepers1 (KEY(id)) ENGINE=MEMORY AS
SELECT fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c, MAX(id) AS id
FROM tbl
GROUP BY fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c;
-- get the #2 top records
CREATE TEMPORARY TABLE keepers2 AS
SELECT fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c, MAX(id) AS id
FROM tbl AS k
WHERE NOT EXISTS (SELECT 1 FROM keepers1 WHERE id = k.id)
GROUP BY fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c;
-- create a temp table where you have all he ids that you want to keep
CREATE TEMPORARY TABLE keepers_all (KEY(id)) ENGINE=MEMORY AS
SELECT id FROM keepers1
UNION ALL
SELECT id FROM keepers2;
-- delete all records that you don't want to keep
DELETE k.* FROM tbl AS k WHERE NOT EXISTS (SELECT 1 FROM keepers_all WHERE id = k.id);
これが1回限りのクリーンアップジョブである場合は、コンソールからクエリを実行できるはずです。しかし、あなたが彼らを募集する仕事を探しているなら、あなたはおそらくこのコードを取り、それを手続きに入れるべきです。
注:ここでは、パフォーマンスを向上させるためにMEMORYTEMPORARYテーブルを使用しています。 「テーブルがいっぱいです」という問題が発生する可能性があります これは、レコードが多すぎるためです。次に、セッションの値max_heap_table_sizeを
のように増やすことができます。SET SESSION tmp_table_size = 1024 * 1024 * 1024 * 2; -- this will set it to 2G
SET SESSION max_heap_table_size = 1024 * 1024 * 1024 * 2; -- this will set it to 2G
これにより、現在の値がわかります
SELECT VARIABLES LIKE 'max_heap_table_size';
SELECT VARIABLES LIKE 'tmp_table_size';