2011-03-08 42 views
1

我在使用mysql查詢時遇到問題。用於繪製圖表,我創建具有「X SECOND」的間隔臨時表與此簡單的結構:在mysql中慢選擇

CREATE TEMPORARY TABLE intervals (date DATETIME NOT NULL PRIMARY KEY) 

和查詢此SELECT:

SELECT COUNT(dt.Device) AS count, i.date 
FROM intervals i LEFT JOIN device_tracker dt ON 
    i.date <= dt.date AND 
    i.date + INTERVAL X SECOND >= dt.date 
GROUP BY i.date 

Device是主鍵和dt.date是索引。

在device_tracker中有20000行AND 30-35間隔查詢大約需要4-5秒。這是正常的嗎?我能做些什麼來提高速度嗎?

這是解釋:

id select_type table type possible_keys key  key_len ref rows Extra 
------------------------------------------------------------------------------------------------------------------- 
1 SIMPLE  i  index NULL   PRIMARY 8  NULL 29  Using index; Using temporary; Using filesort 
1 SIMPLE  dt  ALL  date   NULL  NULL  NULL 21594 

編輯::LAST_TIMEBREAK不存在,我使用的日期代替。

+0

您是否擁有dt.Last_Time的索引? – 2011-03-08 16:45:13

+0

是我的錯,我改變了這個領域的名字。索引繼續存在問題。 – 2011-03-08 16:57:35

+0

如果您將間隔計算移到ON條件的右側,解釋是否會改變?如i.date> = dt.date - INTERVAL X SECOND? – Galz 2011-03-08 21:47:04

回答

1

從Galz響應:

嘗試使用HAVING代替WHERESELECT ... LEFT JOIN ... GROUP BY ... HAVING i.date IS NOT NULL

它的工作。

0

問題可能是device_tracker中的Last_Time字段。您可以嘗試在日期和時間:LAST_TIMEBREAK ...指數爲:

CREATE INDEX myGreatIdx ON device_tracker(date, Last_Time); 
+0

是我的錯,我更改了字段的名稱。索引繼續存在問題。 – 2011-03-08 16:57:18