оптимизация запроса

L0
На сайте с 26.12.2016
Offline
30
673

Как оптимизировать запрос? записей больше 100 000, запрос занимает больше 30с

SELECT `product`.`id`, `product`.`name`, `product`.`condition`, `product`.`city_id`,  `product`.`price`,`user`.`name`  AS `user_name`, `city`.`name` AS `city_name`

FROM `product_to_category` `p2c`
JOIN `product` `product` ON product.id = p2c.product_id
LEFT JOIN `city` `city` ON city.id=product.city_id
LEFT JOIN `user` ON user.id=product.user_id
WHERE (
((`product`.`id` in (
select product_id from product_to_city
join city on (city.id = product_to_city.city_id)
where city.id = 1 or city.parent_id = 1
))) AND

( (`product`.`zombie` = 0)) AND (`product`.`publish` = 1 AND (`product`.`delete` = 0 OR `product`.`delete` is null)))
GROUP BY `product`.`id`
HAVING COUNT(1) > 1
ORDER BY `product`.`timestamp_update` DESC

таблица продукт

таблица city

таблица category

таблица product_to_category

таблица user

таблица product_to_city

explain

Aisamiery
На сайте с 12.04.2015
Offline
293
#1

Пока предполагаю разделить на несколько запросов. Во первых убрать IN с вложенным запросом в WHERE. А то у вас для каждой строки делается выборка при том одна и таже.

Разработка проектов на Symfony, Laravel, 1C-Bitrix, UMI.CMS, OctoberCMS
Jurgen s
На сайте с 21.05.2008
Offline
153
#2

Для удобства поиска узкого места советую оставить голый запрос типа select name from table where ....

И с каждым разом навешиваться новые join и условия.

Но скорее всего узкое место в

((`product`.`id` in (

select product_id from product_to_city
join city on (city.id = product_to_city.city_id)
where city.id = 1 or city.parent_id = 1
)))

Да и вариант разбить на несколько запросов заслуживает жизни!

http://police-ua.com/ (http://police-ua.com/) Форум сотрудников МВД Украины
S
На сайте с 30.09.2016
Offline
469
#3

Солидарен с предыдущим оратором. Уберите вложенный селект, и будет Вам счастье.

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
ДП
На сайте с 23.11.2009
Offline
203
#4

Тоже была как-то проблема с запросом с IN - переписали на inner join - стало быстрее работать.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий