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