Qualsiasi soluzione che tenti di eliminare così tanti dati in una transazione travolgerà il segmento di rollback e causerà molti problemi di prestazioni.
Un buon strumento di aiuto è pt-archiver
. Esegue operazioni incrementali su batch di righe di dimensioni moderate, nel modo più efficiente possibile. pt-archiver
può copiare, spostare o eliminare righe a seconda delle opzioni.
La documentazione include un esempio di eliminazione di righe orfane, che è esattamente il tuo scenario:
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'esecuzione di questa operazione richiederà molto più tempo per eliminare i dati, ma non utilizzerà troppe risorse e senza interrompere il servizio sul database esistente. L'ho usato con successo per eliminare centinaia di milioni di righe di dati obsoleti.
pt-archiver
fa parte del Percona Toolkit for MySQL
, un set gratuito (GPL) di script che aiutano le attività comuni con MySQL e database compatibili.