首先是一些背景知识。我们有一个带有"活币的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分组,这会返回不正确的结果。
有没有人知道更好的方法来执行此查询,这将减少运行查询所需的时间?
答案 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)
上的索引。