【问题标题】:MySQL query times out on the server when it shouldn't take that much timeMySQL 查询在不应该花费那么多时间的情况下在服务器上超时
【发布时间】:2014-08-20 14:11:31
【问题描述】:

我有一个数据库,其中包含商店每天的某些销售记录。显然,每天可能发生多次销售,记录的两个字段是销售发生的日期(日期时间)和价格(双倍)。

我正在尝试获取一组细粒度的数据,这些数据表示午夜之后发生的所有销售价格的金额/总和,除以小时。澄清一下,这里有一个查询,它可以提取从 00:00 到 05:00 小时的当前总和:

SELECT DATE(date), ROUND(SUM(price), 2) FROM `table` WHERE HOUR(date) >= 0 AND HOUR(date) < 5 GROUP BY DATE(date)

到目前为止一切顺利,但这里的第一个问题是,如果某天午夜之后根本没有销售,那么这个日期根本不会出现在结果中,我想至少显示 0 或 NULL那里。 我遇到的另一个问题是我需要更精细的数据,因为我需要显示从 00:00 到 01:00、然后从 01:00 到 02:00 等发生的所有销售的金额。我尝试了以下查询:

SELECT DATE(ts.date),
(SELECT ROUND(SUM(ts1.price), 2) FROM `table` ts1 WHERE HOUR(ts1.date) >= 0 AND HOUR(ts1.date) < 1 AND DATE(ts1.date) = DATE(ts.date) GROUP BY DATE(ts1.date)) AS f0to1,
(SELECT ROUND(SUM(ts2.price), 2) FROM `table` ts2 WHERE HOUR(ts2.date) >= 1 AND HOUR(ts2.date) < 2 AND DATE(ts2.date) = DATE(ts.date) GROUP BY DATE(ts2.date)) AS f1to2,
(SELECT ROUND(SUM(ts3.price), 2) FROM `table` ts3 WHERE HOUR(ts3.date) >= 2 AND HOUR(ts3.date) < 5 AND DATE(ts3.date) = DATE(ts.date) GROUP BY DATE(ts3.date)) AS f2to3,
(SELECT ROUND(SUM(ts4.price), 2) FROM `table` ts4 WHERE HOUR(ts4.date) >= 0 AND HOUR(ts4.date) < 5 AND DATE(ts4.date) = DATE(ts.date) GROUP BY DATE(ts4.date)) AS allhours
FROM `table` ts WHERE 1 GROUP BY DATE(ts.date)

但是,此查询在服务器上超时,我不知道为什么,因为它不应该花那么长时间。我正在使用的数据库有大约 5-6k 条记录和几个月的时间跨度,所以我正在查看结果表中的大约 60 行。关于如何重组查询并使其更高效的任何想法或对其他方法(连接、联合等)的建议?

附:表名和'table'不同,我这里只是为了简单起见改了。

【问题讨论】:

  • 我认为标题清楚地说明了 MySQL,因此服务器确实是 MySQL。
  • 那为什么要标记sql-server?

标签: mysql sql datetime hour


【解决方案1】:

嗯,你想要实现的目标可以分解为几个步骤:

  1. 您需要获取要处理的所有日期的列表。如何 你实现这取决于你的数据库,你会很容易找到 方法。这是示例 - http://www.brianshowalter.com/calendar_tables

    在 Sql Server 中,您可以将生成日期的 SQL 放在 CTE 语句中

  2. 获取您的工作查询并将其 LEFT JOIN 到设置的日期。

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-22
    • 1970-01-01
    • 2018-01-08
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多