Медленный запрос SQL, как его оптимизировать?

Доброго времени суток!
Знакомый попросил сделать хоть что-нибудь, чтобы перестала тормозить корзина в OpenCart.
Я так себе программист, на самом деле, но при помощи профилирования понял, что почти 10 секунд выполняется следующий запрос:
DELETE
	order,
	order_product,
	order_option,
	order_download,
	order_total,
	order_voucher
FROM order
LEFT JOIN order_product ON order_product.order_id = `order`.order_id
LEFT JOIN order_option ON order_option.order_id = `order`.order_id
LEFT JOIN order_download ON order_download.order_id = `order`.order_id
LEFT JOIN order_total ON order_total.order_id = `order`.order_id
LEFT JOIN order_voucher ON order_voucher.order_id = `order`.order_id
WHERE
	order.order_id = '718707' AND order.order_status_id = 0


Помогите его оптимизировать, пожалуйста. Что нужно сделать?
  • Вопрос задан
  • 1724 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Для всех подчинённых таблиц представить связь через FOREIGN KEY ON DELETE CASCADE и удалять только запись из `order`
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
@feldwebel
explain analyze <sql>
и смотри, где идёт seq scan и в целом тратится больше всего времени.

Если лень разбираться с темой, попробуй метод научного тыка. На реплике базы поиграйся с индексами на order.order_id и order.order_status_id, а потом на order_id других джойнящихся таблиц, начиная с самых жирных.

Может и наоборот, таблицы излишне заиндексированы, удаление строки приводит к тяжёлой перестройке индексов.
Так что делай explain и гугли.
Ответ написан
Комментировать
sanchezzzhak
@sanchezzzhak
Ля ля ля...
Сделайте селект с explain у вас LEFT JOIN таблицы не фулскан случаем проходят?

Ну если нужно хард удаление то я бы средствами бд сделал
cascade delete mysql
При удалении из order записи все что связано удалится.
Ответ написан
@nozzy
Symfony, Laravel, SQL
Здесь напрашивается INNER JOIN вместо LEFT JOIN.
Ответ написан
Комментировать
@Serdonda
А про индексы не забыли?
Самое первое - проставьте индексы по всем связанным полям - 100% время выполнения упадет до значиний меньше десятых секунды.
Ответ написан
Acuna
@Acuna
Заполнил свой профиль
А что мешает из каждой таблицы удалять нужные строки отдельными запросами? Ведь это буквально доли секунды на каждый запрос, даже если индексов вообще нет. Ну и да, индексы проставить нужно в любом случае.

P. S. Ну а вообще, сколько я вижу дебри OpenCart, все больше склоняюсь к мысли, что ее разработка началась еще когда разраб учился в школе... Грустно это все...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы