MySQL时间间隔查询重载服务器

时间:2015-03-13 11:49:50

标签: php mysql sql query-optimization

我正在生成一个CSV,其中包含每个项目过去12个月我每月订单的数量。目前,我正在检索项目并使用foreach循环为每个项目提交以下查询,以便检索在过去12个月内每月订购的总时间。但是,查询只需要超过3秒,因此当循环进行几千次时,它会导致MySQL服务器消失。

我该如何优化此查询?如果我使用子查询而不是减少数据库上的负载吗?

以下是查询(改编自here):

SELECT order_item_variant_alias_id, DATE(DATE_FORMAT(order_progress_time, '%Y-%m-01')) AS `trueMonth`, COUNT(*) AS count
FROM tbl_order_progress
JOIN tbl_order_items ON order_progress_order_id = order_item_order_id
JOIN tbl_product_variant_aliases ON order_item_variant_alias_id = product_variant_alias_id
JOIN tbl_product_variants ON product_variant_id = product_variant_alias_variant_id
GROUP BY product_variant_alias_id, DATE(DATE_FORMAT(order_progress_time, '%Y-%m-01'))
HAVING order_item_variant_alias_id = 1

1 个答案:

答案 0 :(得分:1)

为什么要为每个项目运行单独的查询?只需删除having子句并同时放入所有项目。

如果由于某种原因,您确实需要一次执行一项,请将逻辑切换为where子句而不是having子句。 having子句将聚合所有项,然后过滤到所需的项。如果先减少数据,使用where

,MySQL应该更快
SELECT order_item_variant_alias_id,
       DATE(DATE_FORMAT(order_progress_time, '%Y-%m-01')) AS `trueMonth`,
       COUNT(*) AS count
FROM tbl_order_progress JOIN
     tbl_order_items
     ON order_progress_order_id = order_item_order_id JOIN 
     tbl_product_variant_aliases
     ON order_item_variant_alias_id = product_variant_alias_id JOIN
     tbl_product_variants
     ON product_variant_id = product_variant_alias_variant_id
WHERE order_item_variant_alias_id = 1
GROUP BY product_variant_alias_id,
         DATE(DATE_FORMAT(order_progress_time, '%Y-%m-01'));