低スペックのサーバを運用していると数十万行のレコードがあると重くなったりする場合があります。
そんなときに役立つSQL文をまとめました。
特定の日付より以前のレコードを削除
DELETE FROM [テーブル名] WHERE [日付カラム] < '2019-01-01 00:00:00';
一定期間が過ぎたら削除
例:現在から1カ月経過したデータは削除
DELETE FROM [テーブル名] WHERE ([日付カラム] < DATE_SUB(CURDATE(), INTERVAL 1 MONTH));
例:現在から半年経過したデータは削除
DELETE FROM [テーブル名] WHERE ([日付カラム] < DATE_SUB(CURDATE(), INTERVAL 6 MONTH));
例:現在から1年経過したデータは削除
DELETE FROM [テーブル名] WHERE ([日付カラム] < DATE_SUB(CURDATE(), INTERVAL 1 YEAR));
コマンド
例:現在から1カ月経過したデータは削除
mysql --user=[ユーザー名] --password=[パスワード] --database=[DB名] --execute="DELETE FROM [テーブル名] WHERE ([日付カラム] < DATE_SUB(CURDATE(), INTERVAL 1 MONTH))"
例:現在から半年経過したデータは削除
mysql --user=[ユーザー名] --password=[パスワード] --database=[DB名] --execute="DELETE FROM [テーブル名] WHERE ([日付カラム] < DATE_SUB(CURDATE(), INTERVAL 6 MONTH))"
例:現在から1年経過したデータは削除
mysql --user=[ユーザー名] --password=[パスワード] --database=[DB名] --execute="DELETE FROM [テーブル名] WHERE ([日付カラム] < DATE_SUB(CURDATE(), INTERVAL 1 YEAR))"
cron設定
cronの仕様 分 時 日 月 曜日 コマンド ※曜日は日(0)-土(6)
例:毎日3時に実行 現在から1カ月経過したデータは削除
0 3 * * * mysql --user=[ユーザー名] --password=[パスワード] --database=[DB名] --execute="DELETE FROM [テーブル名] WHERE ([日付カラム] < DATE_SUB(CURDATE(), INTERVAL 1 MONTH))"
例:毎週日曜日3時に実行 現在から半年経過したデータは削除
0 3 * * 0 mysql --user=[ユーザー名] --password=[パスワード] --database=[DB名] --execute="DELETE FROM [テーブル名] WHERE ([日付カラム] < DATE_SUB(CURDATE(), INTERVAL 6 MONTH))"
例:毎月1日に実行 現在から1年経過したデータは削除
0 0 1 * * mysql --user=[ユーザー名] --password=[パスワード] --database=[DB名] --execute="DELETE FROM [テーブル名] WHERE ([日付カラム] < DATE_SUB(CURDATE(), INTERVAL 1 YEAR))"