Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Оптимизация запроса mysql
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Оптимизация запроса mysql

Страниц (1): [1]
 

1. x-miller-x - 30 Декабря, 2016 - 14:36:45 - перейти к сообщению
можете подсказать как оптимизировать такой запрос

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT count(*)
  2. FROM `product`
  3. WHERE ((((`product`.`id` IN (
  4.                     SELECT product_id FROM product_to_city
  5.                     JOIN city ON (city.id = product_to_city.city_id)
  6.                     WHERE city.id = 1 OR city.parent_id = 1
  7.                 )))) AND (`product`.`publish` = 1 AND (`product`.`delete` = 0 OR `product`.`delete`
  8. IS NULL))) AND (product.id IN (SELECT product_id FROM product_to_category
  9. WHERE category_id IN (SELECT id FROM category WHERE parent_id IN
  10. (11))))

p.s. индексы все расставлены

переписал на exists но тут вот эта часть медленно выполняется

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT product_id FROM product_to_city
  3.                     JOIN city ON (city.id = product_to_city.city_id)
  4.                     WHERE city.id = 1 OR city.parent_id = 1
2. OrmaJever - 30 Декабря, 2016 - 14:53:35 - перейти к сообщению
а нельзя что ли джоинами всё заменить?
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT count(*)
  2. FROM product p
  3. JOIN product_to_city ptc
  4.         ON p.id = ptc.product_id
  5. JOIN city c
  6.         ON ptc.city_id = c.id
  7. JOIN product_to_category ptcat
  8.         ON p.id = ptcat.product_id
  9. JOIN category cat
  10.         ON ptcat.category_id = cat.id
  11. WHERE p.publish = 1 AND
  12.         (p.`delete` = 0 OR p.`delete` IS NULL) AND
  13.         (c.id = 1 OR c.parent_id = 1) AND
  14.         (cat.parent_id IN (11))

писал на коленке, не факт что всё верно, но смысл я думаю вы поймёте
3. x-miller-x - 30 Декабря, 2016 - 18:57:55 - перейти к сообщению
чет разница с джоинами и моим методом в 2 раза почти результат отличается, в моем случае 68 элементов выводятся с джоинами 112 , 68 правильно
4. T1grOK - 30 Декабря, 2016 - 20:11:22 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT COUNT(DISTINCT p.id) ...
5. x-miller-x - 30 Декабря, 2016 - 21:31:58 - перейти к сообщению
T1grOK пишет:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT COUNT(DISTINCT p.id) ...

четко, спасибо!)
6. OrmaJever - 30 Декабря, 2016 - 22:38:35 - перейти к сообщению
да, это всё из-за того что 2 джоина по p.id
ON p.id = ptc.product_id
и
ON p.id = ptcat.product_id
поэтому id могут повторяться
7. x-miller-x - 02 Февраля, 2017 - 18:09:18 - перейти к сообщению
что то при большой нагрузке этот запрос + запрос не только количества, а еще и выборка полей сильно нагружает сервак...( есть еще какие нибудь решения?
8. OrmaJever - 02 Февраля, 2017 - 21:31:25 - перейти к сообщению
есть варианты посмотреть explain
9. x-miller-x - 06 Февраля, 2017 - 08:07:33 - перейти к сообщению
CODE (text):
скопировать код в буфер обмена
  1.  
  2. SELECT `product`.`id`, `product`.`name`, `product`.`condition`, `product`.`city_id`,  `product`.`price`,`user`.`name`  AS `user_name`, `city`.`name` AS `city_name`
  3. FROM `product_to_category` `p2c`
  4. JOIN `product` `product` ON product.id = p2c.product_id
  5. LEFT JOIN `city` `city` ON city.id=product.city_id
  6. LEFT JOIN `user` ON user.id=product.user_id
  7. WHERE (
  8. ((`product`.`id` in (
  9.                                         select product_id from product_to_city
  10.                                         join city on (city.id = product_to_city.city_id)
  11.                                         where city.id = 1 or city.parent_id = 1
  12.                                 ))) AND
  13.  
  14. ( (`product`.`zombie` = 0)) AND (`product`.`publish` = 1 AND (`product`.`delete` = 0 OR `product`.`delete` is null)))
  15. GROUP BY `product`.`id`
  16. HAVING COUNT(1) > 1
  17. ORDER BY `product`.`timestamp_update` DESC
  18.  


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


таблица city


таблица category


таблица product_to_category


таблица user


таблица product_to_city


explain

 

Powered by ExBB FM 1.0 RC1