Отправить заявку

MySQL - удаление одним запросом записей в нескольких таблицах

При оптимизации одного проекта встала задача сократить количество запросов к базе MySQL. Меню каталога товаров строилось рекурсивной функцией, которая каждый свой проход делала 2 запроса в базу (для генерации одной страницы, только на отображение категорий товаров интернет-магазина было около 110 запросов!!!) Забегая на перед (это отдельная тема для статей, связанных с глобальной оптимизацией проектов) скажем, что после оптимизации, клиенту не пришлось покупать супер-пупер сервер (как говорили специалисты хостинговой компании), а даже перейти на более дешевый тарифный план. При этом скорость загрузки сайта ощутимо возросла.

После изучения фронтенд части сайта - вывод напрашивался сам за себя - ПЕРЕПИСАТЬ ВСЕ С НУЛЯ! Но заказчика это не устроило :( По этому пришлось проводить точечную оптимизацию отдельно взятых кусков кода и запросов. Первоначально было проанализировано самые узкие места, которые тормозили сайт сильнее остальных. Одним из таких мест были сотни запросов на удаление записей из разных таблиц.

Т.к. на сайте происходило массовое удаление/добавление записей - мы решили свести количество запросов на удаление к минимуму.

Мы решили не удалять записи в течении прайм-тайм работы сайта вообще, а лишь скрывать эти строки у пользователя (а потом, когда наступает время "сонного юзера" - выполнять всю работу). Но этот шаг не дал желаемого результата. Скорость работы сайта возросла, но нагрузка не сократилась. Вариант с триггерами, особого прироста тоже не дал.

Тогда мы попробовали объединить удаление записей цельные запросы - это дало ощутимый результат!

Допустим у нас есть таблица, запись которой связывается еще с порядком 12 таблиц по ключу. Задача: удалить связанные строки из всех таблиц.
Рассмотрим маленький пример удаления одним запросом одной записи из двух таблиц:

DELETE `user`, `user_content`
FROM
`user`, `user_content`
WHERE
`user`.`id` = `user_content`.`id` AND `user`.`id` = '1666554'

Количество таблиц в запросе может быть гораздо больше. Удаление одним запросом в нескольких таблицах дает прирост из-за открытия меньшего числа потоков к базе данных.

Другие публикации