在MySql中按AVERAGE和COUNT排序的最佳方法

时间:2012-09-11 09:38:49

标签: mysql optimization indexing

我正在研究一个简单的评级系统,就像我问Here

一样

数据是半大的(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`)
)

它存储每个图像的用户比率。正如你所看到的,我只有一个用于此表的关键字(imageid),用于另一个查询中的OUTER JOIN ......

但是在没有任何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排序,不能使用索引)

2 个答案:

答案 0 :(得分:2)

各种统计数据的常见优化 - 是预先计算。

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

实际状态可以通过触发器或按计划维护。

答案 1 :(得分:1)

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

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

select (sum_rates / count_rates)
from images

此查询必须更有效。