私は毎日データをフェッチしている非常に大きなテーブルを持っていて、そのサイズは毎日大きくなっていますが、私のソフトウェアでは、6か月のデータのみが役立ちます。そのため、6か月以上経過したデータを削除する予定です。 CRONジョブを使用してそれを実行できることはわかっていますが、MYSQLを使用して古いデータを自動的に削除したいと思います。私はPARTITION
についても読み、私の質問はPARTITION
を使用してそれを実行できますか、それとも別の方法を見つける必要がありますか?
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 ;
それがまさに今私がしていることです。テーブルを月ごとに分割し、翌月の初めにMySQLのスケジュールされたイベントを実行して、最も古いイベントをdrop
に実行し、新しいイベントを作成します。このようにして、すべてがMySQLによって内部的に処理されます。
もちろん、そもそもパーティション化できるかどうかはテーブル構造に依存します。 (さらに、パーティションの初期設定には、テーブルのサイズによっては時間がかかる場合があります)。