[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вертикальное/горизонтальное удаление в mysql
GET
Привет.


Есть таблица 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
вынести сие в отдельный метод / процедуру.

После того, как вариант 1 будет вылизан, заменить его вариантом 2

А транзакции отслеживаются просто
file_put_contents('sqlerror.log', $sql);


_____________
[продано копирайтерам]
GET
Вопрос в принципе снят в пользу первого, горизонтального варианта, но если есть что сказать, буду рад.

AllesKlar

Цитата
После того, как вариант 1 будет вылизан, заменить его вариантом 2


В каком смысле?

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
GET
Такое удаление планируется в "спящий час", поэтому думаю все же не буду изобретать велосипед. Сделаю все же горизонтально.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
AllesKlar
ABC
В каком смысле?

Ну, в том смысле, что всегда есть дилема - быстро исполняемый код или лекго читаемый, расширяемый код.

Я в своей практике делаю так (на твоем примере):
Используем вариант 1.
Удаление заносится в какой-нидь метод.
После ттого, как со временем все баги будут отловлены и передушенны, переписываем этот метод на вариант 2.

Но, раз у тебя это в "сонный час", то и смысла заморачиваться нет.



_____________
[продано копирайтерам]
GET
AllesKlar
Спасибо.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Invis1ble
Если таблицы InnoDB и есть связи между ними, то 1-3 делается одним запросом.
Ну и делать надо через оператор IN конечно же.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

GET
Invis1ble
Цитата
Ну и делать надо через оператор IN конечно же.

Ты имеешь ввиду как бы второй вариант? Ну тогда я ошибку отследить не смогу вот в чем дело.
Цитата
(некоторые пункты например 1 и 2 можно сделать одним запросом)


То, что объединить их можно я знаю, это я специально расписал логику.


_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Invis1ble
Цитата
Ты имеешь ввиду как бы второй вариант? Ну тогда я ошибку отследить не смогу вот в чем дело.
GET
Invis1ble

Ну скажем ... в середине ID не окажется....или сбой залочится одна из таблиц

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
GET
Цитата
Ну скажем ... в середине ID не окажется


В том запросе. который будет к отдельной таблице не в объеденных, что количество удаленных строк не совпадет с количесвтом в массиве

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
GET
Invis1ble

Блин, все разобрался, какую-то глупость наговорил. Спасибо.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
Invis1ble
Цитата
в середине ID не окажется

для IN это не имеет значения

Цитата
сбой залочится одна из таблиц

реализовать логирование и перезапуск транзакции

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

GET
Цитата
реализовать логирование и перезапуск транзакции

Ок.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
FatCat
Для жизненноважной информации практикую сброс копии информации в файл перед удалением.
То есть, сначала
SELECT * FROM таблица WHERE условия
Полученная информация записывается в формате запроса на INSERT и запросы сбрасываются в файл.

_____________
Бесплатному сыру в дырки не заглядывают...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.