【问题标题】:MySQL time interval query overloading serverMySQL时间间隔查询重载服务器
【发布时间】:2015-03-13 11:49:49
【问题描述】:

我正在生成一个 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

【问题讨论】:

    标签: php mysql sql query-optimization


    【解决方案1】:

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

    如果出于某种原因,您确实需要一次执行一项,请将逻辑切换到 where 子句而不是 having 子句。 having 子句将聚合 所有 项,然后过滤到您想要的项。如果你先减少数据,MySQL 应该会更快——使用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'));
    

    【讨论】:

      猜你喜欢
      • 2013-01-07
      • 2021-03-02
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      • 1970-01-01
      • 2019-06-04
      相关资源
      最近更新 更多