当MySQL不应该花费那么多时间时,MySQL查询会在服务器上超时

时间:2014-08-20 14:11:32

标签: mysql sql datetime hour

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

我试图获得一组精细的数据,这些数据代表午夜之后发生的所有销售价格的金额/总和,以小时为单位。为了澄清,这是一个有效的查询,并从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行。任何想法如何重组查询,使其更有效或建议其他方法(联接,工会等)?

P.S。表名与&#39; table&#39;不同,我只是为了简单起见而改变了它。

1 个答案:

答案 0 :(得分:0)

嗯,您想要实现的目标可以分几步进行分解:

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

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

  2. 接受您的工作查询,并将LEFT JOIN加入日期设置。

  3. 希望有所帮助。