Php MYSQL查询优化

Php MYSQL查询优化,php,mysql,Php,Mysql,我正在尝试优化在电子商务网站上运行的报表查询。我很确定我在做一些愚蠢的事情,因为这个查询的运行时间不应该像它一样长。 问题是: SELECT inventories_name, inventories_code, SUM(shop_orders_inventories_qty) AS qty, SUM(shop_orders_inventories_price) AS tot_price, inventories_categories_name, inventories_price_list,

我正在尝试优化在电子商务网站上运行的报表查询。我很确定我在做一些愚蠢的事情,因为这个查询的运行时间不应该像它一样长。 问题是:

SELECT inventories_name, inventories_code, SUM(shop_orders_inventories_qty) AS qty, 
SUM(shop_orders_inventories_price) AS tot_price, inventories_categories_name,
inventories_price_list, inventories_id 
FROM shop_orders 
LEFT JOIN shop_orders_inventories ON (shop_orders_id = join_shop_orders_id)
LEFT JOIN inventories ON (join_inventories_id = inventories_id)
WHERE {$date_type} BETWEEN '{$start_date}' AND '{$end_date}'
AND shop_orders_x_response_code = 1
GROUP BY join_inventories_id, join_shop_categories_id
{$order} 
{$limit}
它基本上是试图在一段时间内获得每件商品的总销售额;花括号中的值通过表格填写。它可以在几天内正常工作,但查询一周或更长的时间间隔可能需要30秒以上

我觉得它为了计算聚合值而连接了太多行,占用了大量内存,但我不确定如何限制它

注意-我意识到我选择的字段不在group by中,但它们与group by中的库存ID对应1-1

有什么建议吗

-编辑- 目前的指数是: 存货: 加入类别-BTREE 库存名称、库存代码、库存描述-全文

车间订单库存: 车间\订单\库存\ id-BTREE

店铺订单:
商店订单id-BTREE索引的首要规则是。。。为要搜索的列编制索引

对于{$date_type}的每个可能值,为该日期列创建一个索引

一旦你在表格中有很多数据,比如说2年或100周,一周的数据是指数的1%,因此它成为一个很好的起点

尽管MySQL在SELECT子句中允许非聚合,但我个人还是会将两者同步

SELECT inventories_name, inventories_code,
       SUM(shop_orders_inventories_qty) AS qty, 
       SUM(shop_orders_inventories_price) AS tot_price,
       inventories_categories_name, inventories_price_list, inventories_id 
FROM ...
GROUP BY inventories_id, join_shop_categories_id, inventories_name,
         inventories_code, inventories_categories_name, inventories_price_list
...

两个连续的左连接将在一个大表上运行相当长的时间。尝试使用联接而不是左联接,除非您在车间订单中有记录,并且现在在车间订单库存或库存中有匹配的记录,或者将此查询拆分为两个小查询。此外,通过使用sum和group by,您正在强制MySQL创建临时表-您可能希望增加MySQL缓存,以便这些表能够装入内存,否则MySQL将将把它们转储到磁盘,这也会增加SQL执行时间。

这些表有哪些索引?非常好的建议-只需从左连接切换到连接,就可以获得巨大的成功性能提升