2

我必须监督一些事情,但我有以下查询:

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 秒。

有没有一种简单的方法来优化它,或者如果函数只需要这么长时间?

4

1 回答 1

0

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

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
于 2012-10-07T13:19:29.430 回答