Как оптимизировать запрос Mysql?

Есть запросы где делаются запросы на подобии:

SELECT count(distinct(product.id))
FROM `product`
JOIN `product_to_category` `p2c` ON product.id = p2c.product_id
JOIN `city` `c` ON c.id = product.city_id
LEFT JOIN `city` `city` ON city.id=product.city_id
LEFT JOIN `company` ON company.id=product.company_id
WHERE ((`product`.`publish` = 1)) AND (c.id = 108 or c.parent_id = 108) AND ((`p2c`.`category_id` IN (917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950)));

я как понимаю в основном тут вот эта часть долго выполняется при нагрузке
((`p2c`.`category_id` IN (917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950))

как можно оптимизировать?
  • Вопрос задан
  • 124 просмотра
Пригласить эксперта
Ответы на вопрос 2
rpsv
@rpsv
делай либо хорошо, либо никак
Сделайте EXPLAIN запроса и потом уже смотрите что не так.
И на первый взгляд DISTINCT лишний, т.к. ID должен быть уникальным (если нет, то по первичному ключу получайте количество).

---

Вот этот JOIN лишний:
LEFT JOIN `city` `city` ON city.id=product.city_id
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
LEFT JOIN'ы не нужны - их данные нигде не используются. Условия из WHERE можно попробовать перенести в ON.
SELECT COUNT(DISTINCT `p`.`id`)
  FROM `product` AS `p`
  JOIN `product_to_category` AS `p2c` ON `p`.`id` = `p2c`.`product_id`
    AND `p`.`publish` = 1
    AND `p2c`.`category_id` IN (917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950)
  JOIN `city` AS `c` ON `c`.`id` = `p`.`city_id`
    AND (`c`.`id` = 108 OR `c`.`parent_id` = 108)

Ну и правильные индексы, тут уже смотрите EXPLAIN/
Ответ написан
Ваш ответ на вопрос

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

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