Toute solution qui tente de supprimer autant de données en une seule transaction va submerger le segment de restauration et causer de nombreux problèmes de performances.
Un bon outil pour vous aider est pt-archiver
. Il effectue des opérations incrémentielles sur des lots de lignes de taille moyenne, aussi efficacement que possible. pt-archiver
peut copier, déplacer ou supprimer des lignes selon les options.
La documentation inclut un exemple de suppression de lignes orphelines, ce qui correspond exactement à votre scénario :
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
L'exécution de cette opération prendra beaucoup plus de temps pour supprimer les données, mais cela n'utilisera pas trop de ressources et sans interrompre le service sur votre base de données existante. Je l'ai utilisé avec succès pour purger des centaines de millions de lignes de données obsolètes.
pt-archiver
fait partie du Percona Toolkit for MySQL
, un ensemble de scripts gratuits (GPL) qui facilitent les tâches courantes avec MySQL et les bases de données compatibles.