2011-01-20 89 views
1

我有一個MySQL表像這樣的:幫助需要優化的MySQL SELECT查詢

day  int(11) 
hour int(11)  
amount int(11) 

日是用從0跨越至365的值的整數,假設小時是一個時間戳和量僅僅是一個簡單整數。我想要做的是選擇金額字段的值爲特定的一組天數(例如從0到10),但我只需要當天可用金額的最後一個值,這實際上是小時字段有其最大值(當天內)。這聽起來不太難,但我提出的解決方案完全沒有效率。

這就是:

SELECT q.day, q.amount 
    FROM amt_table q 
    WHERE q.day >= 0 AND q.day <= 4 AND q.hour = (
     SELECT MAX(p.hour) FROM amt_table p WHERE p.day = q.day 
    ) GROUP BY day 

它需要5秒鐘執行一個11K行表查詢,它只是需要5天的跨度;我可能需要選擇整個月份或年份的跨度,因此這不是有效的解決方案。如果需要的話

如果誰可以幫我找到另一種解決方案或優化這個人是真的感謝

編輯

沒有指標設定,但(日,小時,量)可能是一個PRIMARY KEY

+1

設置了哪些索引?無論如何,請發表您的表CREATE語句(或架構轉儲) - 它會讓人們更容易提出建議。 – 2011-01-20 23:27:06

+0

實際上沒有設置索引,因爲我不知道如何正確設置它們來幫助整體性能。無論如何,正如我所說(日,小時,金額)可能是主鍵 – 2011-01-20 23:32:57

回答

4

用途:

SELECT a.day, 
     a.amount 
    FROM AMT_TABLE a 
    JOIN (SELECT t.day, 
       MAX(t.hour) AS max_hour 
      FROM AMT_TABLE t 
     GROUP BY t.day) b ON b.day = a.day 
         AND b.max_hour = a.hour 
WHERE a.day BETWEEN 0 AND 4 

我認爲你正在使用GROUP BY a.day只是爲了得到儘可能每天一筆金額,但它不可靠,因爲在MySQL中,不在GROUP BY中的列是任意的 - 值可能會改變。可悲的是,MySQL還不支持分析(ROW_NUMBER等),這是您通常用於這些情況的分析。

首先查看主鍵上的索引,然後在用於將表連接在一起的列上添加索引。合成索引(多個列到索引)也是一個選項。

0

我認爲問題是where子句中的子查詢。 MySQl首先會爲整個表格計算這個「SELECT MAX(p.hour)FROM amt_table p WHERE p.day = q.day」,然後選擇日期。效率不高:-)