2014-09-29 4 views
1

У меня проблема с оптимизацией очень медленного запроса preashop SQL (для получения результата mysql занимает около 3,5 секунд).MySQL - медленная оптимизация запросов

Запрос:

SELECT 
    SQL_CALC_FOUND_ROWS a.*, a.id_order AS id_pdf, 
    CONCAT(LEFT(c.`firstname`, 1), '. ', c.`lastname`) AS `customer`, 
    osl.`name` AS `osname`, 
    os.`color`, 
    IF((SELECT COUNT(so.id_order) FROM `ps_orders` so WHERE so.id_customer = a.id_customer) > 1, 0, 1) as new, 
    (SELECT COUNT(od.`id_order`) FROM `ps_order_detail` od WHERE od.`id_order` = a.`id_order` GROUP BY `id_order`) AS product_number 
FROM `ps_orders` a 
LEFT JOIN `ps_customer` c 
    ON (c.`id_customer` = a.`id_customer`) 
LEFT JOIN `ps_order_history` oh 
    ON (oh.`id_order` = a.`id_order`) 
LEFT JOIN `ps_order_state` os 
    ON (os.`id_order_state` = oh.`id_order_state`) 
LEFT JOIN `ps_order_state_lang` osl 
    ON (os.`id_order_state` = osl.`id_order_state` AND osl.`id_lang` = 6) 
WHERE 1 
    AND oh.`id_order_history` = (SELECT MAX(`id_order_history`) FROM `ps_order_history` moh WHERE moh.`id_order` = a.`id_order` GROUP BY moh.`id_order`) 
ORDER BY `date_add` DESC 
LIMIT 0,50 

EXPLAIN Результат:

EXPLAIN Result

Что я должен делать?

Заранее благодарим за ответы.

+0

Есть ли у вас какие-либо индексы? – max

+0

Да, создаются индексы (по умолчанию prestashop) – user1768501

+0

Какое время внутреннего запроса, ELECT MAX ('id_order_history') FROM' ps_order_history' moh WHERE moh.'id_order' = a.'id_order' GROUP BY moh.' id_order' и создали ли вы надлежащие индексы, т.е. столбцы, используемые для сравнения? – Anil

ответ

2

Это немного для комментария.

explain выглядит разумно. Кроме. В финале order by требуется файл filesort на 204 480 строк, что, вероятно, занимает большую часть времени. Неясно, откуда исходит столбец date_add. Но, возможно, вы знаете, что все строки появятся с прошлой недели или около того. Если это так, то дополнительный пункт where может помочь:

where date_added >= now() - interval 7 day and . . . 
+0

Когда я удалял предложение ORDER BY, это занимает около 3 секунд. – user1768501

+0

@ пользователь1768501. , , Что происходит, когда вы удаляете 'SQL_CALC_FOUND_ROWS'? Это также заметно замедляет запросы. –

+0

Ничего себе, теперь это занимает около 0,0116 секунды, поэтому я думаю, что вы нашли причину этой медлительности, спасибо большое, оцените это. – user1768501