2014-05-07 32 views
0

沒有任何人有任何建議,以優化這個查詢:讓我知道如果我可以優化此查詢?

SELECT COUNT(client_id) FROM (
    SELECT client_id FROM `cdr` WHERE 
    (DATE(start) BETWEEN '2014-04-21' AND '2014-04-25') AND 
    `service` = 'test' 
    GROUP BY client_id 
    HAVING SUM(duration) > 300 
)as t1 

的問題是,內部查詢掃描數百萬行並返回行的幾千,這讓主查詢懶惰。

謝謝。

+0

執行計劃是怎樣的? – Gumbo

+0

'start' datetime的類型是什麼? –

+0

@ Mostafa-T:你可以嘗試我建議的查詢,如果你顯示你想要的結果,它可以進一步優化。 –

回答

2

嘗試下面的查詢,避免搜索,因爲它不使用索引和殺滅性能的功能。 「開始」列必須編入索引。

SELECT COUNT(client_id) FROM (
    SELECT client_id FROM `cdr` WHERE 
    (start BETWEEN '2014-04-21 00:00:00' AND '2014-04-25 23:59:59') AND 
    `service` = 'test' 
    GROUP BY client_id 
    HAVING SUM(duration) > 300 
)as t1 
+1

'start> ='2014-04-21'AND start <'2014-04-26'' –

+1

@HamletHakobyan是的,它會給出相同的結果,而mysql建議使用> =和<=運算符,而不是......之間,但根據我的實驗,有一點甚至我們沒有注意到的差異。但是,我們應該使用它作爲MySQL的建議,至少不會降低性能和機會,以提高..但這裏性能退化的主要原因是日期函數..所以我建議他這樣做。即使查詢可以在刪除子查詢後進一步優化,但是如果用戶分享他想要的結果。 –

+0

一秒鐘,查詢錯誤的時間很長:) –

0

你可以使用直接查詢,而不是子查詢等作爲

SELECT COUNT(client_id) FROM `cdr` 
WHERE (DATE(start) BETWEEN '2014-04-21' AND '2014-04-25') 
    AND `service` = 'test' 
GROUP BY client_id 
HAVING SUM(duration) > 300 
1

爲什麼不呢?我看過的地方,比較日期直接與<或>作品比之間實現更快。

SELECT Count(client_id) FROM `cdr` 
WHERE DATE(start) >= '2014-04-21' 
    AND DATE(start) <= '2014-04-25' 
    AND `service` = 'test' 
GROUP BY client_id 
HAVING SUM(duration) > 300 

什麼是邏輯背後有你的SQL中的子查詢?

+0

這個查詢返回數以千計的行,我以前有過,我想COUNT這些行而不是行,所以我添加了另一個查詢來計算這些行的COUNT。 –