Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-慢速查询优化_Mysql_Sql_Performance_Prestashop - Fatal编程技术网

MySQL-慢速查询优化

MySQL-慢速查询优化,mysql,sql,performance,prestashop,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

我在优化一个非常慢的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
解释结果:

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
看起来很合理。除了最后的order by需要对204480行进行文件排序,这可能会占用很多时间。不清楚列
date\u add
来自何处。但是,也许你知道,所有的争吵都将发生在上周左右。如果是这样,那么额外的
where
子句可能会有帮助:

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

你有索引吗?是的,有创建的索引(prestashop默认)内部查询的时间,选择MAX(
id\u order\u history
)从
ps\u order\u history
moh WHERE moh.
id\u order
=a.
id\u order
按moh分组
id\u order
并且您是否创建了适当的索引,即用于比较的列?上面的查询速度很快(大约0.1005秒),我认为索引是正确的。在删除IF((选择COUNT(so.id\u order)后也尝试运行从
ps\u订单
so,其中so.id\u客户=a.id\u客户)>1,0,1)作为新的(选择计数(od.
id\u订单
)从
ps\u订单详情
od,其中od.
id\u订单
=a.
id\u订单
分组作为产品编号,这些都会影响性能。我还有一个关于“ORDER BY
date\u add
DESC”的问题,这个日期\u add属于哪个表。当我删除
ORDER BY
子句时,仍然需要大约3秒钟。@user1768501。删除
SQL\u CALC\u FOUND\u行时会发生什么情况?这也明显降低了查询速度。哇,现在大约需要0.0116秒,所以我认为您已经找到了速度缓慢的原因,非常感谢,非常感谢。