多くのアプリケーションで、(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
各実行後にイベントを保持するために追加する必要があります。詳細については、次を参照してください。スケジュールされたイベントをトリガーするには、次の手順を実行します。