Всяко решение, което се опитва да изтрие толкова много данни в една транзакция, ще претовари сегмента за връщане назад и ще причини много проблеми с производителността.
Добър инструмент за помощ е 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
е част от Percona Toolkit за MySQL
, безплатен (GPL) набор от скриптове, които помагат при общи задачи с MySQL и съвместими бази данни.