MySQL - 按间隔查询优化分组

时间:2017-09-27 12:04:46

标签: mysql sql

首先是一些背景知识。我们有一个带有"活币的MySQL数据库"表。我们使用API​​每5秒为不同货币提取最新货币值。该表目前有超过800万行。

表的结构如下:

id (INT 11 PK)
currency (VARCHAR 8)
value (DECIMAL
timestamp (TIMESTAMP)

现在我们尝试使用此表在图表上绘制数据。我们将有各种不同的图表,例如:实时,每小时,每日,每周,每月。

我对查询有点麻烦。以每周图表为例,我想以15分钟的间隔输出过去7天的数据。所以这就是我尝试的方式:

SELECT *
FROM currency_data
WHERE ((currency = 'GBP')) AND (timestamp > '2017-09-20 12:29:09')
GROUP BY UNIX_TIMESTAMP(timestamp) DIV (15 * 60)
ORDER BY id DESC

这会输出我想要的数据,但查询速度非常慢。我觉得GROUP BY子句是原因。

另外顺便说一句,我已经关闭了sql模式' ONLY_FULL_GROUP_BY'因为它也迫使我按ID分组,这会返回不正确的结果。

有没有人知道更好的方法来执行此查询,这将减少运行查询所需的时间?

1 个答案:

答案 0 :(得分:1)

您可能希望为要执行的每个图形创建摘要表。

如果您的数据确实是每5秒发布一次,您可以尝试以下内容:

SELECT *
FROM currency_data cd
WHERE currency = 'GBP' AND
      timestamp > '2017-09-20 12:29:09' AND
      UNIX_TIMESTAMP(timestamp) MOD (15 * 60) BETWEEN 0 AND 4
ORDER BY id DESC;

对于此查询和原始查询,您需要currency_data(currency, timestamp, id)上的索引。