0

私は ここで尋ねたように、単純な評価システムに取り組んでいます

データはセミラージ(100kレコード)です。次の構造のレートテーブルがあります。

CREATE TABLE IF NOT EXISTS `rates` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `rate` int(10) unsigned NOT NULL DEFAULT '0',
  `ip` int(10) unsigned DEFAULT NULL,
  `imageid` int(10) unsigned NOT NULL DEFAULT '0',
  `sdate` date DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `imageid` (`imageid`)
)

各画像のユーザーの割合を保存します。ご覧のとおり、別のクエリでOUTER JOINに使用されるこのテーブルのキー(imageid)があります...

しかし、JOINのないこの単純なクエリでは、私にも問題があります。

SELECT r.imageid,COUNT(r.id) as cnt,AVG(r.rate) AS arate,MAX(r.sdate) as lastdate  FROM rates r  GROUP BY r.imageid 
ORDER BY
arate DESC, cnt DESC,lastdate DESC

Explainは、クエリが一時的なものを使用していると述べています。filesortを使用します。私の大規模なデータベースでは問題があり、この問題は私のメインのJOINクエリに広がります。

ソートせずにフィールドのトップ平均を取得する方法はありますか?(AVGでソートし、インデックスは使用できません)

4

2 に答える 2

2

さまざまな統計の一般的な最適化は、事前計算です。

100%の実際の平均が必要な場合は非常にまれです。したがって、別のテーブルに事前計算して、結果をすぐに取得します。

実際の状態は、トリガーまたはスケジュールによって維持される場合があります。

于 2012-09-11T09:42:57.427 に答える
1

私の意見-テーブル画像で使用-フィールドsum_ratesとcount_rates、そしてすべてのレートで-sum_ratesにrateを追加し、count_ratesに+1を追加します。

また、平均レートを取得する必要がある場合は、これを選択できます

select (sum_rates / count_rates)
from images

このクエリはかなりうまくいくはずです。

于 2012-09-11T09:42:17.257 に答える