我必须监督某些事情,但我有以下疑问:
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函数只需要这么长时间吗?
答案 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