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

解释说查询是使用临时的;使用文件排序。在我的大型数据库中,这是一个问题,这个问题蔓延到我的主要 JOIN 查询。

有没有办法在不排序的情况下获得字段的最高平均值?(它按 AVG 排序,不能使用索引)

4

2 回答 2

2

各种统计数据的共同优化 - 是预先计算。

当您需要 100% 的实际平均值时,这是非常罕见的。因此,只需将其预先计算到另一个表并立即获得结果。

实际状态可以通过触发器或调度来维护。

于 2012-09-11T09:42:57.427 回答
1

我的意见 - 在表格图像中使用 - 字段 sum_rates 和 count_rates 以及每个比率 - 将比率添加到 sum_rates 并将 +1 添加到 count_rates。

如果您需要获得平均费率,您可以选择

select (sum_rates / count_rates)
from images

这个查询必须更有效。

于 2012-09-11T09:42:17.257 回答