Задать вопрос
coderisimo
@coderisimo

Как увеличить скорость выполнения SQL запроса?

имеется жуткий запрос :
SELECT
  p.*,
  product_shop.*,
  stock.out_of_stock,
  IFNULL(stock.quantity, 0)                                               AS quantity,
  MAX(product_attribute_shop.id_product_attribute)                        AS id_product_attribute,
  product_attribute_shop.minimal_quantity                                 AS product_attribute_minimal_quantity,
  pl.`description`,
  pl.`description_short`,
  pl.`available_now`,
  pl.video,
  pl.`available_later`,
  pl.`link_rewrite`,
  pl.`meta_description`,
  pl.`meta_keywords`,
  pl.`meta_title`,
  pl.`name`,
  MAX(image_shop.`id_image`)                                              AS id_image,
  il.`legend`,
  m.`name`                                                                AS manufacturer_name,
  cl.`name`                                                               AS category_default,
  DATEDIFF(product_shop.`date_add`, DATE_SUB(NOW(), INTERVAL 75 DAY)) > 0 AS new,
  product_shop.price                                                      AS orderprice

FROM `ps_category_product` cp LEFT JOIN `ps_product` p ON p.`id_product` = cp.`id_product`
  INNER JOIN ps_product_shop product_shop ON (product_shop.id_product = p.id_product AND product_shop.id_shop = 1)
  LEFT JOIN `ps_product_attribute` pa ON (p.`id_product` = pa.`id_product`)
  LEFT JOIN ps_product_attribute_shop product_attribute_shop
    ON (product_attribute_shop.id_product_attribute = pa.id_product_attribute AND product_attribute_shop.id_shop = 1 AND
        product_attribute_shop.`default_on` = 1)
  LEFT JOIN ps_stock_available stock ON (stock.id_product = p.id_product AND stock.id_product_attribute = IFNULL(
      `product_attribute_shop`.id_product_attribute, 0) AND stock.id_shop = 1)
  LEFT JOIN `ps_category_lang` cl
    ON (product_shop.`id_category_default` = cl.`id_category` AND cl.`id_lang` = 1 AND cl.id_shop = 1)
  LEFT JOIN `ps_product_lang` pl ON (p.`id_product` = pl.`id_product` AND pl.`id_lang` = 1 AND pl.id_shop = 1)
  LEFT JOIN `ps_image` i ON (i.`id_product` = p.`id_product`)
  LEFT JOIN ps_image_shop image_shop
    ON (image_shop.id_image = i.id_image AND image_shop.id_shop = 1 AND image_shop.cover = 1)
  LEFT JOIN `ps_image_lang` il ON (image_shop.`id_image` = il.`id_image` AND il.`id_lang` = 1)
  LEFT JOIN `ps_manufacturer` m ON m.`id_manufacturer` = p.`id_manufacturer`
WHERE product_shop.`id_shop` = 1 AND cp.`id_category` = 25 AND product_shop.`active` = 1 AND
      product_shop.`visibility` IN ("both", "catalog")
GROUP BY product_shop.id_product
ORDER BY `sale` DESC
LIMIT 0, 100;


план выполнения :
SQL_PLAN.jpg
вот ссылка на большую картинку : https://dl.dropboxusercontent.com/u/19954007/asks/...

видно, что самый "тяжелый" - первый (Using temporary; Using filesort). Но уже там используется PRIMARY.
Можно ли как то все ускорить . Сейчас время выполнения 0.9253 сек.
куда копать.
Спасибо

ЗЫ Структура таблиц вот здесь - https://dl.dropboxusercontent.com/u/19954007/asks/...
  • Вопрос задан
  • 1038 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
sim3x
@sim3x
Сюда копай dev.mysql.com/doc/refman/5.7/en/explain.html

добавить индекс на
ps_category_product.id_category

Добавить индекс на
ps_product_shop.`active`
ps_product_shop.`visibility`

потом убрать и сравнить с индексом по (
product_shop.`id_shop` = 1 AND cp.`id_category` = 25 AND product_shop.`active` = 1 AND
product_shop.`visibility` IN ("both", "catalog"))
Ответ написан
ruFelix
@ruFelix
Предсказание будущего по руке, таро, кофе.
Найдите способ добавить в WHERE условие которое ограничит множество product_shop.id_product тем которое сейчас входит в LIMIT.

Т.е. этот запрос валят строки
ORDER BY `sale` DESC
LIMIT 0, 100;
над ними и парьтесь.
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы
25 дек. 2024, в 08:00
20000 руб./за проект
25 дек. 2024, в 07:53
20000 руб./за проект
25 дек. 2024, в 07:45
20000 руб./за проект