Привет.
Есть таблица tab1
с ней связаны таблицы tab2, tab3, tab4
Таблицы INNODB.
Из таблицы tab1 нужно будет удалять по N строк, где-то 200-300 за раз.
Как думаете, как лучше сделать:
Горизонтально:
Включаем транзакцию, через BEGIN:
1. Удаляем строку из tab1
2. Удаляем 2-3 строки из tab2
3. Удаляем 2-3 строки из tab3
4. Обновляем 1-2 строки в tab4
Завершаем транзакцию через COMMIT/ROLLBACK
(некоторые пункты например 1 и 2 можно сделать одним запросом)
Итак в цикле (200-300 раз).
------------------
Минус: 600-900 подобных запросов в каждую таблицу.
Плюс: Можно отслеживать каждую строку в tab1, чтоб если что при косяках это не повлияло на остальные.
Вертикально:
1. В массив T1 id строки на удаление из tab1
2. В массив T2 id строк на удаление из tab2
3. В массив T3 id строк на удаление из tab2
4. В массив T4 id строк на обновление в tab2
Итак в цикле (200-300 раз).
------------
Когда цикл сформировал массивы:
Включаем транзакцию, через BEGIN:
1. Удаляем строки из tab1 через IN(implode(',',T1));
2. Удаляем строки из tab2 через IN(implode(',',T2));
3. Удаляем строки из tab3 через IN(implode(',',T3));
4. Обновляем строки из tab4 через IN(implode(',',T4));
Завершаем транзакцию через COMMIT/ROLLBACK
Минус: Нельзя отследить косячный id, если что то пойдет не так никаких изменения вообще не произойдет, транзакции все отменят т.к. касаются сразу всех строк
Плюс: Всего 4 запроса за раз.
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
AllesKlar
13.02.2014 - 18:10
вынести сие в отдельный метод / процедуру.
После того, как вариант 1 будет вылизан, заменить его вариантом 2
А транзакции отслеживаются просто
file_put_contents('sqlerror.log', $sql);
_____________
[продано копирайтерам]
Вопрос в принципе снят в пользу первого, горизонтального варианта, но если есть что сказать, буду рад.
AllesKlar
Цитата |
После того, как вариант 1 будет вылизан, заменить его вариантом 2 |
В каком смысле?
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Такое удаление планируется в "спящий час", поэтому думаю все же не буду изобретать велосипед. Сделаю все же горизонтально.
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
AllesKlar
13.02.2014 - 18:27
ABCВ каком смысле?
Ну, в том смысле, что всегда есть дилема - быстро исполняемый код или лекго читаемый, расширяемый код.
Я в своей практике делаю так (на твоем примере):
Используем вариант 1.
Удаление заносится в какой-нидь метод.
После ттого, как со временем все баги будут отловлены и передушенны, переписываем этот метод на вариант 2.
Но, раз у тебя это в "сонный час", то и смысла заморачиваться нет.
_____________
[продано копирайтерам]
AllesKlar
Спасибо.
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Invis1ble
13.02.2014 - 18:36
Если таблицы InnoDB и есть связи между ними, то 1-3 делается одним запросом.
Ну и делать надо через оператор IN конечно же.
_____________
Профессиональная разработка на заказЯ на GitHub |
второй профиль
Invis1ble
Цитата |
Ну и делать надо через оператор IN конечно же. |
Ты имеешь ввиду как бы второй вариант? Ну тогда я ошибку отследить не смогу вот в чем дело.
Цитата |
(некоторые пункты например 1 и 2 можно сделать одним запросом) |
То, что объединить их можно я знаю, это я специально расписал логику.
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Invis1ble
13.02.2014 - 18:48
Цитата |
Ты имеешь ввиду как бы второй вариант? Ну тогда я ошибку отследить не смогу вот в чем дело. |
Invis1ble
Ну скажем ... в середине ID не окажется....или сбой залочится одна из таблиц
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Цитата |
Ну скажем ... в середине ID не окажется |
В том запросе. который будет к отдельной таблице не в объеденных, что количество удаленных строк не совпадет с количесвтом в массиве
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Invis1ble
Блин, все разобрался, какую-то глупость наговорил. Спасибо.
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Invis1ble
13.02.2014 - 19:01
Цитата |
в середине ID не окажется |
для IN это не имеет значения
Цитата |
сбой залочится одна из таблиц |
реализовать логирование и перезапуск транзакции
_____________
Профессиональная разработка на заказЯ на GitHub |
второй профиль
Цитата |
реализовать логирование и перезапуск транзакции |
Ок.
_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
FatCat
13.02.2014 - 23:56
Для жизненноважной информации практикую сброс копии информации в файл перед удалением.
То есть, сначала
SELECT * FROM таблица WHERE условия
Полученная информация записывается в формате запроса на INSERT и запросы сбрасываются в файл.
_____________
Бесплатному сыру в дырки не заглядывают...
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.