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 秒かかります。

それを最適化する簡単な方法はありますか、それとも If 関数は非常に時間がかかりますか?

4

1 に答える 1

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