在MySQL中花费很长时间的简单查询

时间:2012-10-07 12:53:52

标签: 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

在包含超过150万条目的数据库中大约需要15秒。

有一种简单的方法可以优化它,或者If函数只需要这么长时间吗?

1 个答案:

答案 0 :(得分:0)

你能试试这个查询吗?我从查询中删除了一些常量计算,因为每行的操作往往非常慢。另外,我会在查询中使用常量而不是CURDATE()函数,因此DB服务器可以对其进行优化。我无法尝试,让我知道它是否有效,我可以用更多细节来解释它。

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

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