mysql表设计为每日轮换评级最高

时间:2013-06-06 23:35:26

标签: mysql sql query-optimization rating

我将顶级视图和“赞”存储在名为“计数”的表中。每晚一次我运行此查询

UPDATE `counts` SET rank=d7+d6+d5+d4+d3+d2+d1,d7=d6,d6=d5,d5=d4,d4=d3,d3=d2,d2=d1,d1=0

一周中的每一天都有一个d1-d7变量,我们每晚将它“向下”移动一次并重新计算总和。

随着我的网站的增长,此查询现在需要大约20分钟。

我正在寻找有关如何更有效地组织这些建议的建议,因为它似乎可能是一种常见的模式。

1 个答案:

答案 0 :(得分:1)

正如评论所说,我们需要看到架构。但无论如何我会提出一个建议。没有7个不同的字段d1-d7。如果您以后决定将分数保持一年以上怎么办?哎哟。

我将假设countsview_id作为PK。然后让另一个表ranks包含列view_id(设置为FK到counts),rank(概括d1-d7,无论它们是什么数据类型)和rank_date ,这是一个约会。现在每天晚上都有

UPDATE counts SET rank = (SELECT SUM(rank) FROM ranks r WHERE r.view_id=counts.view_id
                        AND r.rank_date>=DATE_SUB(CURDATE(), INTERVAL 1 WEEK) );

[某些RDBMS在UPDATE查询中允许JOIN类型语法。我相信MySQL理解类似以下内容,但它不是我常用的RDBMS

UPDATE counts, (SELECT view_id, SUM(rank) AS srank FROM ranks r 
                WHERE  r.rank_date>=DATE_SUB(CURDATE(), INTERVAL 1 WEEK) 
                GROUP BY r.view_id) AS q1 
SET rank = srank
WHERE counts.view_id=q1.view_id;   

如果是这样,那可能会比第一个版本运行得更快。

同时,可选择清理,您可以删除超过1周的ranks行,但是在更灵活的架构中,您不必删除。