2017-09-27 74 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)的索引。