2011-10-07 230 views
5

我有以下查詢:MySQL查詢提高性能

SELECT COUNT(sid),fDate,COUNT(DISTINCT(cid)) 
    FROM forwarding 
    WHERE fDate BETWEEN "2011-06-01" AND "2011-06-30" 
    GROUP BY fDate 

解釋給我下面的輸出:

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE forwarding index fDate,fDate_2 fDate_2 3  1481127 Using where 

你可以看到,有大量的數據。 總工作時間爲12秒。 我該如何提高性能?我不知道我可以做更多的設置索引。

有我的索引此表:

fDate (fDate, f_shop) 
fDate2(dDate), 
f_shop(f_shop) 

謝謝您的幫助。

UPDATE:

現在我在where子句中添加一列,查詢慢得多然後之前。

SELECT COUNT(sid),fDate,COUNT(DISTINCT(cid)) FROM forwarding 
WHERE fDate BETWEEN "2011-06-01" AND "2011-06-30" AND f_shop=10077 GROUP BY fDate 

我有一個關於forwardDate和f_shop的索引,但性能會變慢。什麼是完美的解決方案? 謝謝

+0

嘗試'(fDate,cid)'索引。 –

+0

如果'sid'不能爲'NULL',請使用COUNT(*)而不是COUNT(sid) –

+0

問題:是'DATE'類型還是'DATETIME'類型的'fDate'? –

回答

3

除了ypercube的提供答案,你的查詢,你正在尋找一個特定的商店......我會對

(f_shop,FDATE,CID)的指標,以確保所有3個部分該指數被用於與前面最小的WHERE子句預選賽..你最後的樣品中,你已經包括在特定商店的興趣......

SELECT 
     COUNT(sid), 
     fDate, 
     COUNT(DISTINCT(cid)) 
    FROM 
     forwarding 
    WHERE 
      f_shop=10077 
     AND fDate BETWEEN "2011-06-01" AND "2011-06-30" 
    GROUP BY 
     fDate 
+0

是的,非常感謝。訂單的重要性是否重要?我怎麼知道fDate和f_shop是不夠的? – user954740

+1

@ user954740,是的,順序很重要,應該按照您試圖在普通查詢基礎上找到的最細粒度的部分。在這種情況下,我會假設F_SHOP,因爲您可以有100多個F_SHOP條目。因此,首先按日期範圍掃描,您仍然可以跳過所有其他「商店」。通過在第一個位置上,你正在開始與一家商店,然後在那裏,只有你關心的日期範圍。 – DRapp