2012-10-07 137 views
2

我必須監督的東西,但我有以下查詢:簡單的查詢需要長時間在MySQL

SELECT 
    `Poster`, Round(Sum(If((`Date`>=DATE_ADD(CURDATE(),INTERVAL -1 Month) And `Date`<CURDATE()),1,0))/DATEDIFF(CURDATE(),DATE_ADD(CURDATE(),INTERVAL -1 Month)),0) AS `statistics` 
FROM `forenposts` 
GROUP BY `Poster` 
ORDER BY `statistics` DESC 
LIMIT 5 

這需要大約15秒有超過1.5萬個條目的數據庫。

有沒有一種簡單的方法來優化它,或者只是花費這麼長時間的If函數?

回答

0

你可以試試這個查詢嗎?我從查詢中刪除了一些常量計算,因爲每行的操作往往非常緩慢。另外,我會在查詢中使用常量而不是CURDATE()函數,因此數據庫服務器可以優化它。我無法嘗試,讓我知道它是否有效,我可以用更多的細節來解釋它。

SET @CURDATE = CURDATE(); 
SET @DATEADD = DATE_ADD(@CURDATE,INTERVAL -1 Month); 
SET @DATEDIFF = DATEDIFF(@CURDATE,@DATEADD); 

SELECT 
    `Poster`, 
    Round(Sum(If((`Date`>[email protected] And `Date`< @CURDATE), 1, 0))/@DATEDIFF,0) AS `statistics` 
FROM `forenposts` 
GROUP BY `Poster` 
ORDER BY `statistics` DESC 
LIMIT 5 
+0

謝謝你,這降低了速度爲3.75秒。我不確定,如果有可能讓它低於這個水平。 – Spurious

+0

順便說一句,我不確定,如果哪裏優化是正確的,是嗎?我把它從我的答案中刪除,你可以試試這個版本,如果它返回mase結果? – jpesout

+0

結果是一樣的! 我想將其轉換爲PHP代碼,但我無法讓它工作。 這是我使用的代碼: $ stmt = $ conn-> prepare(「SET @CURDATE = CURDATE(); SET @PREVDATE = DATE_ADD(@CURDATE,INTERVAL - 」。$ timeperiod。「); SET @DIFF = DATEDIFF(@CURDATE,@PREVDATE); SELECT'Poster',Round(Sum(1/@DIFF),0)AS'statistics' FROM'forenposts' WHERE Date>> @ PREVDATE和'Date' <@CURDATE GROUP BY'Poster' ORDER BY'statistics' DESC LIMIT 5;「); – Spurious