通知テーブルに、Amazon IODSの1000 IOPSのホストである約1億行が含まれており、1か月より古い行を削除したいと思います。
DELETE FROM NOTIFICATION WHERE CreatedAt < DATE_SUB(CURDATE(), INTERVAL 30 day);
を実行すると、すべてのIOPSが取得され、プロセスに数時間かかり、「ロック待機タイムアウトが超過しました。トランザクションを再起動してください」という理由で、多くの新しいエントリを挿入できません。
ここで説明する方法を実行しようとしました: http://mysql.rjweb.org/doc.php/deletebig ただし、増分IDの代わりにUUIDを使用しています。
挿入/更新される新しいデータに影響を与えずにこれらの行を削除するための正しい効率的な方法は何ですか?
一時テーブルを作成し、切り替えて、過去30日間のデータをコピーします。
#
# Make empty temp table
#
CREATE TABLE NOTIFICATION_NEW LIKE NOTIFICATION;
#
# Switch in new empty temp table
#
RENAME TABLE NOTIFICATION TO NOTIFICATION_OLD,NOTIFICATION_NEW TO NOTIFICATION;
#
# Retrieve last 30 days data
#
INSERT INTO NOTIFICATION SELECT * FROM NOTIFICATION_OLD
WHERE CreatedAt >= DATE_SUB(CURDATE(), INTERVAL 30 DAY);
営業時間外に、古いテーブルをドロップしてください
DROP TABLE NOTIFICATION_OLD;
このようなDELETEを実行する利点は次のとおりです
NOTIFICATION
は、空のテーブルに切り替えることで高速に空になります。NOTIFICATION
は新しいINSERTですぐに使用できますNOTIFICATION
に追加され、新しいINSERTを実行できます。NOTIFICATION
を削除しても、新しいINSERTは妨害されません試してみる !!!
私のお気に入りは、Percona Toolkitの pt-archiver です。 MySQLの負荷、レプリケーションラグを処理します。