1つのトランザクションで大量のデータを削除しようとするソリューションは、ロールバックセグメントを圧倒し、多くのパフォーマンスの問題を引き起こします。
役立つツールは、pt-archiver
です。 。中程度のサイズの行のバッチに対して、可能な限り効率的に増分操作を実行します。 pt-archiver
オプションに応じて、行をコピー、移動、または削除できます。
ドキュメントには、孤立した行を削除する例が含まれています。これはまさにあなたのシナリオです:
pt-archiver --source h=host,D=db,t=VALUE --purge \
--where 'NOT EXISTS(SELECT * FROM `KEY` WHERE key_id=`VALUE`.key_id)' \
--limit 1000 --commit-each
これを実行すると、データの削除にかなり長い時間がかかりますが、既存のデータベースのサービスを中断することなく、あまり多くのリソースを使用することはありません。私はこれを使用して、何億行もの古いデータを削除することに成功しました。
pt-archiver
MySQL用Perconaツールキット
の一部です 、MySQLおよび互換性のあるデータベースでの一般的なタスクを支援する無料の(GPL)スクリプトセット。