我将顶级视图和“赞”存储在名为“计数”的表中。每晚一次我运行此查询
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分钟。
我正在寻找有关如何更有效地组织这些建议的建议,因为它似乎可能是一种常见的模式。
答案 0 :(得分:1)
正如评论所说,我们需要看到架构。但无论如何我会提出一个建议。没有7个不同的字段d1-d7。如果您以后决定将分数保持一年以上怎么办?哎哟。
我将假设counts
有view_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
行,但是在更灵活的架构中,您不必删除。