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

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

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

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

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

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

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

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

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


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



Написать комментарий через:

 
               
  • Локальный блог
  •  
 

Ваш отзыв

Имя *

Почта (скрыта) *

Сайт

Напишите цифрами двa вoceмь двa *

Сообщение

Отзывов (4) на «MySQL – удаление одним запросом записей в нескольких таблицах»

  1. Roman пишет:

    Спасибо! Но если таблицы связанные, и одна из них пустая – то запрос не работает((

  2. sharp пишет:

    вот все как в примере, но пишет ORA-00933: SQL command not properly ended

  3. sharp пишет:

    DELETE students_hobbies, hobbi, students
    FROM students, students_hobbies, hobbi
    WHERE students.nomer_zachetki=students_hobbies.nomer_zachetki AND students_hobbies.nazvanie_hobbi=hobbi.nazvanie_hobbi AND nazvanie_hobbi=’Terorist_action’

 
Статусы для соц.сетей на ArtKiev Design Studio