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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Оптимизация запроса mysql

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
x-miller-x
Отправлено: 30 Декабря, 2016 - 14:36:45
Post Id


Новичок


Покинул форум
Сообщений всего: 52
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




можете подсказать как оптимизировать такой запрос

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
 
 Top
OrmaJever
Отправлено: 30 Декабря, 2016 - 14:53:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




а нельзя что ли джоинами всё заменить?
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))

писал на коленке, не факт что всё верно, но смысл я думаю вы поймёте

(Отредактировано автором: 30 Декабря, 2016 - 14:54:06)



-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
x-miller-x
Отправлено: 30 Декабря, 2016 - 18:57:55
Post Id


Новичок


Покинул форум
Сообщений всего: 52
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




чет разница с джоинами и моим методом в 2 раза почти результат отличается, в моем случае 68 элементов выводятся с джоинами 112 , 68 правильно
 
 Top
T1grOK
Отправлено: 30 Декабря, 2016 - 20:11:22
Post Id



Частый гость


Покинул форум
Сообщений всего: 129
Дата рег-ции: Июнь 2013  


Помог: 7 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT COUNT(DISTINCT p.id) ...


-----
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
 
 Top
x-miller-x
Отправлено: 30 Декабря, 2016 - 21:31:58
Post Id


Новичок


Покинул форум
Сообщений всего: 52
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




T1grOK пишет:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT COUNT(DISTINCT p.id) ...

четко, спасибо!)
 
 Top
OrmaJever
Отправлено: 30 Декабря, 2016 - 22:38:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




да, это всё из-за того что 2 джоина по p.id
ON p.id = ptc.product_id
и
ON p.id = ptcat.product_id
поэтому id могут повторяться

(Отредактировано автором: 31 Декабря, 2016 - 01:03:54)



-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
x-miller-x
Отправлено: 02 Февраля, 2017 - 18:09:18
Post Id


Новичок


Покинул форум
Сообщений всего: 52
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




что то при большой нагрузке этот запрос + запрос не только количества, а еще и выборка полей сильно нагружает сервак...( есть еще какие нибудь решения?
 
 Top
OrmaJever
Отправлено: 02 Февраля, 2017 - 21:31:25
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


Помог: 299 раз(а)




есть варианты посмотреть explain


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
x-miller-x
Отправлено: 06 Февраля, 2017 - 08:07:33
Post Id


Новичок


Покинул форум
Сообщений всего: 52
Дата рег-ции: Апр. 2012  


Помог: 0 раз(а)




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
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB