2015-09-30 51 views
1

我有我認爲是一個非常基本的查詢,但它需要很長時間才能運行。我的MySQL服務器的我可以加速一個相對簡單的時間戳選擇查詢嗎?

具體細節:

  • Ubuntu服務器14.04,運行64-bit作爲VMware Workstation虛擬機
  • 2GB的RAM專用於VM

我的表m運行查詢有33列:一個時間戳和32個有良好名稱的列(例如LEW91_4)。目前在表中有大約250萬條記錄。井列的數據類型爲float。索引是:

  • 柱:NDX,指數:PRIMARY
  • 柱:t_stamp,指數:C1_Flowst_stampndx

查詢:

SELECT 
    DATE_FORMAT(t_stamp, '%m/%d/%Y %h:00 %p') as 'Date', 
    AVG(LEW91_1R97) as 'LEW91_1R97', 
    AVG(LEW91_2R97) as 'LEW91_2R97', 
    AVG(LEW91_3R97) as 'LEW91_3R97', 
    AVG(LEW91_4) as 'LEW91_4', 
    AVG(LEW97_1) as 'LEW97_1', 
    AVG(LEW97_3) as 'LEW97_3', 
    AVG(LEW97_4) as 'LEW97_4', 
    AVG(LEW97_6) as 'LEW97_6', 
    AVG(LEW97_7) as 'LEW97_7', 
    AVG(LEW97_8) as 'LEW97_8', 
    AVG(LEW97_12) as 'LEW97_12' 

    FROM C1_Flows 
    WHERE DAY(t_stamp) = 28 
    AND MONTH(t_stamp) = 09 
    AND YEAR(t_stamp) = 2015 
    GROUP BY DAY(t_stamp), HOUR(t_stamp) 

查詢目前正在大致11秒當我從MySQL Workbench運行它時運行。當它從我用來開發HMI的基於Java的界面中運行時,它會超時出現「Read timed out」特定錯誤。

我在類似的服務器上運行了更復雜的查詢(即連接,聯合,if語句等),並且它們比這個運行得更快。有沒有一種方法可以加快速度,或者我錯過了一些明顯的東西?

+0

從輸出中忽略所有平均值的結果然而,當從不同的(Java)上下文中調用'read timed out'時聽起來好奇。超時是否設置了某種實用性? – user2864740

+0

WHERE子句過濾之後,剩餘多少條記錄? –

+1

在t_stamp上加上一個索引並使用'WHERE t_stamp ='2015-09-28''看看是否有改進 – fthiella

回答

5

不要使用

WHERE DAY(t_stamp) = 28 
AND MONTH(t_stamp) = 09 
AND YEAR(t_stamp) = 2015 

改用

WHERE t_stamp >= '2015-09-28' AND t_stamp < '2015-09-29' 

WHERE t_stamp >= '2015-09-28' AND t_stamp < ADDDATE('2015-09-28', INTERVAL 1 DAY) 

,並已超過t_stamp的索引。按照你寫的方式,每條記錄都需要計算where子句,並且索引不能使用。

+0

這是行不通的,因爲如果它恰好是午夜,它只會匹配't_stamp'。 – Barmar

+0

是@Barmar,趕上,改正! –

+0

這是有'DATE'字段相當大的幫助。如果您關心速度,您希望避免在WHERE子句中使用邏輯分支和函數調用。 – tadman

1

用途:

WHERE t_stamp BETWEEN '2015-09-28 00:00' AND '2015-09-28 23:59:59' 

以匹配該日所有時間戳。

這將使用索引。

相關問題