web-dev-qa-db-ja.com

MYSQL innodbテーブルから6か月前のデータを自動的に削除する方法

私は毎日データをフェッチしている非常に大きなテーブルを持っていて、そのサイズは毎日大きくなっていますが、私のソフトウェアでは、6か月のデータのみが役立ちます。そのため、6か月以上経過したデータを削除する予定です。 CRONジョブを使用してそれを実行できることはわかっていますが、MYSQLを使用して古いデータを自動的に削除したいと思います。私はPARTITIONについても読み、私の質問はPARTITIONを使用してそれを実行できますか、それとも別の方法を見つける必要がありますか?

5
Jatin Seth

Event Scheduler を使用すると、スケジュールに従って定期的なイベントを実行できます。 Stack Overflowの my post に詳細な例があります。時間間隔の値を24時間から6か月に変更するだけです。

まず、イベントスケジューラが有効になっていることを確認します。それを有効にするには

SET GLOBAL event_scheduler = ON;

その後、 crate event で行の作成時間を確認し、古いレコードを削除できます。例えば

CREATE EVENT cleaning ON SCHEDULE EVERY 1 MONTH ENABLE
  DO 
  DELETE FROM MyTable
  WHERE `timestamp_column` < CURRENT_TIMESTAMP - INTERVAL 6 MONTH;

テーブルに行作成のタイムスタンプを持つ列がない場合は、現在のタイムスタンプと挿入された行識別子を補助テーブルに挿入するトリガーを作成できます。

CREATE TRIGGER logCreator AFTER INSERT ON MainTable
  FOR EACH ROW 
  INSERT INTO LogTable (MainID, Created) 
  VALUES(NEW.id, CURRENT_TIMESTAMP);

次に、このログを使用して、特定の時間より前に作成されたメインテーブル行のキーを取得し、対応するレコードを削除できます。

delimiter |
CREATE EVENT cleaning ON SCHEDULE EVERY 1 MONTH ENABLE
  DO
  BEGIN
    DECLARE MaxTime TIMESTAMP;
    SET MaxTime = CURRENT_TIMESTAMP - INTERVAL 6 MONTH;
    DELETE FROM MainTable
    WHERE id IN (SELECT MainID FROM LogTable WHERE Created < MaxTime);
    DELETE FROM LogTable
    WHERE LogTable.Created < MaxTime;
  END |
delimiter ;
3
Alexander

PARTITION BY RANGE(TO_DAYS(...));週ごとに分割します。次に、毎週のcronタスクで1週間をドロップし、新しい空のパーティションを構築します。 詳細

パーティションを構築するときに、必ずインデックスを調整してください。一意のキーまたは主キーには、パーティションキーを含める必要があります。これには、通常を最後に追加する必要があります。

メインのSELECTsSHOW CREATE TABLEさらなる批評をご希望の場合。

This は、PRIMARY KEY値、チャンク単位で削除。該当する場合、PARTITIONingが最適です。

2
Rick James

それがまさに今私がしていることです。テーブルを月ごとに分割し、翌月の初めにMySQLのスケジュールされたイベントを実行して、最も古いイベントをdropに実行し、新しいイベントを作成します。このようにして、すべてがMySQLによって内部的に処理されます。

もちろん、そもそもパーティション化できるかどうかはテーブル構造に依存します。 (さらに、パーティションの初期設定には、テーブルのサイズによっては時間がかかる場合があります)。

参照 MySQLテーブルファイルを分割する方法?

0
IGGt