coderisimo
@coderisimo

Как оптимизировать запрос к MySQL (используем explain, много картинок)?

Изучаю тему. В логе медленных запросов есть такой монстр :
SQL_RESULT.jpg
https://dl.dropboxusercontent.com/u/19954007/asks/...
SELECT p.*, product_shop.*, stock.out_of_stock, IFNULL(stock.quantity, 0) as quantity, MAX(product_attribute_shop.id_product_attribute) 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`) 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` = 218 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;


вот что выдает explain : explain.jpg
https://dl.dropboxusercontent.com/u/19954007/asks/...
вроде индексы есть везде
Но , если например взять одно поле использующееся в JOIN - image_shop.id_image и посмотреть в таблицу с ним
key.jpg
https://dl.dropboxusercontent.com/u/19954007/asks/...
то видно что оно не имеет индекса. Т.е там составной индекс.

скажите, если я создам доп индекс персонально для mage_shop.id_image это ускорит процесс ?

PS еще одна непонятная штука : при профилировании запроса видно, что большая часть времени тратится на копирование во временную таблицу
profiling.jpg
https://dl.dropboxusercontent.com/u/19954007/asks/...

так что возможно основные проблемы не касаются оптимизации именно запроса, а скорее оптимизации MYSQL?

как всегда любые конструктивные мысли вэлкам!
Спасибо
  • Вопрос задан
  • 312 просмотров
Пригласить эксперта
Ответы на вопрос 2
Sanasol
@Sanasol
нельзя просто так взять и загуглить ошибку
Меньше секунды при таком запросе как-то вроде даже ничего.

Оптимизировать -> временные таблицы на SSD диск или tmpfs ram
Ответ написан
@shagguboy
у вас лимит без ORDER BY
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы