我正在生成一个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
答案 0 :(得分:1)
为什么要为每个项目运行单独的查询?只需删除having
子句并同时放入所有项目。
如果由于某种原因,您确实需要一次执行一项,请将逻辑切换为where
子句而不是having
子句。 having
子句将聚合所有项,然后过滤到所需的项。如果先减少数据,使用where
:
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'));