2017-09-27 72 views
0

一些背景优先。我们有一个带有“实时货币”表的MySQL数据库。我们使用API​​每5秒钟为不同货币提取最新货币值。该表目前拥有超过800万行。表MySQL - 按间隔查询优化组

结构如下:

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

现在,我们正在尝试使用此表上绘制图表中的数据。我们将会有各种不同的图表,例如:Live,Hourly,Daily,Weekly,Monthly。

我在查询时遇到了一些麻烦。以Weekly图为例,我想要输出最近7天的数据,间隔15分钟。所以这里是我如何尝试它:

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',因为它迫使我通过编组以及,这是返回不正确的结果。

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

回答

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)的索引。