mysql - 在 MySql 中按 AVG 和 COUNT 排序的最佳方法

标签 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

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

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

最佳答案

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

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

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

关于mysql - 在 MySql 中按 AVG 和 COUNT 排序的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12366834/

相关文章:

javascript - Chrome 的 V8 标记功能反复优化直到放弃

mysql - 每个连接的计数 - 优化

performance - USER_TAB_COLUMNS 中的 LOW_VALUE 和 HIGH_VALUE

python - 如何将 pandas Series 的 "rows"转换为 DataFrame 的列?

mysql - 如何在Spring boot中使用ST_CONTAINS?

sql - 在 Windows Server 2003 企业版上并排安装 SQL Server 2008 R2 和 MySQL 是否安全?

php - MySQL 拒绝在 Windows 7 或 Win2k3 上使用 Apache 2.2 和 PHP 5.2

mysql - 从不同的表中选择属性记录

python - 如何优化编辑距离代码?

sql-server - : Clustered indexes are stored physically on the table? 这句话是什么意思