MySQL - 慢速查询优化

时间:2014-09-29 11:24:49

标签: mysql sql performance prestashop

我在优化一个非常慢的prestashop SQL查询时遇到了问题(mysql需要大约3.5秒才能得到结果)

查询:

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

我该怎么办?

提前感谢您的答案。

1 个答案:

答案 0 :(得分:2)

评论时间有点长。

explain看起来很合理。除了。最终的order by需要一个204,480行的文件排序,这可能占了大部分时间。目前还不清楚专栏date_add的来源。但是,也许您知道所有行都将来自上周左右。如果是这样,那么额外的where子句可能会有所帮助:

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