Недавно я обнаружил и исправил ошибку на сайте, над которым работал, что приводило к миллионам повторяющихся строк данных в таблице, которая была бы довольно большой даже без них (все еще миллионы). Я могу легко найти эти повторяющиеся строки и выполнить один запрос на удаление, чтобы уничтожить их все. Проблема в том, что попытка удалить столько строк за один раз блокирует таблицу на долгое время, чего я хотел бы избежать, если это возможно. Единственные способы, которыми я вижу, чтобы избавиться от этих строк, не удаляя сайт (путем блокировки таблицы):
- Напишите скрипт, который будет выполнять тысячи небольших запросов на удаление в цикле. Теоретически это позволит обойти проблему с заблокированной таблицей, потому что другие запросы смогут попасть в очередь и выполняться между удалениями. Но это все равно сильно увеличит нагрузку на базу данных и займет много времени.
- Переименуйте таблицу и воссоздайте существующую таблицу (теперь она будет пустой). Затем сделайте мою очистку на переименованной таблице. Переименуйте новую таблицу, верните старую и объедините новые строки в переименованную таблицу. Этот способ требует значительно больше шагов, но должен выполнять работу с минимальными перерывами. Единственная сложная часть здесь заключается в том, что рассматриваемая таблица является таблицей отчетов, поэтому, как только она будет переименована и на ее место будет помещена пустая, все исторические отчеты исчезнут, пока я не верну ее на место. Кроме того, процесс слияния может быть немного болезненным из-за типа сохраняемых данных. В целом, это мой вероятный выбор прямо сейчас.
Мне просто интересно, сталкивалась ли кто-нибудь еще с этой проблемой раньше, и если да, то как вы справились с ней, не отключив сайт и, надеюсь, с минимальным вмешательством в работу пользователей? Если я выберу номер 2 или другой, похожий подход, я могу запланировать запуск материала поздно ночью и выполнить слияние рано утром следующего дня и просто сообщить пользователям заранее, так что это не имеет большого значения. Я просто смотрю, есть ли у кого-нибудь идеи о лучшем или более простом способе очистки.