MySQL から古い行を定期的に削除する最良の方法は何ですか? 質問する

MySQL から古い行を定期的に削除する最良の方法は何ですか? 質問する

多くのアプリケーションで、(x) 日以上経過した行を定期的に削除したいと思うことがあります。トラフィック量の多いテーブルでこれを最も効率的に行うには、どのような方法が最適ですか?

たとえば、通知を保存するテーブルがあり、これを 7 日間だけ保持したいとします。または、ハイスコアを 31 日間だけ保持したいとします。

現在、投稿されたエポックタイムを保存する行を保持し、1 時間に 1 回実行され、次のように増分ごとに削除する cron ジョブを実行します。

DELETE FROM my_table WHERE time_stored < 1234567890 LIMIT 100

mysql_affected_rows が 0 を返すまでこれを実行します。

以前はすべてを一度に実行していましたが、INSERTS が積み重なる間、アプリケーション内のすべての処理が 30 秒ほど停止していました。LIMIT を追加するとこの問題は軽減されましたが、もっと良い方法があるのではないかと考えています。

ベストアンサー1

必要な時間間隔後にデータベース上で自動的に実行されるイベントを作成してみてください。

次に例を示します。列エントリ 'datetime' を持つテーブル 'tableName' から 30 日以上経過したエントリを削除する場合、次のクエリが毎日実行され、必要なクリーンアップ アクションが実行されます。

CREATE EVENT AutoDeleteOldNotifications
ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 DAY 
ON COMPLETION PRESERVE
DO 
DELETE LOW_PRIORITY FROM databaseName.tableName WHERE datetime < DATE_SUB(NOW(), INTERVAL 30 DAY)

ON COMPLETION PRESERVE各実行後にイベントを保持するために追加する必要があります。詳細については、次を参照してください。スケジュールされたイベントをトリガーするには、次の手順を実行します。

おすすめ記事