mysql表格设计,每日轮换最高评级
我将俯视图和“喜欢”存储在一个名为“计数”的表中。我每晚运行一次这个查询mysql表格设计,每日轮换最高评级,mysql,sql,query-optimization,rating,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分钟 我正在寻找关于如何更有效地组织这项工作的建议,因为这似乎是一种常见的模式。正如评论所说,我们需要查看模式。不过我还是会
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分钟
我正在寻找关于如何更有效地组织这项工作的建议,因为这似乎是一种常见的模式。正如评论所说,我们需要查看模式。不过我还是会提个建议的。没有7个不同的字段d1-d7。如果以后你决定把分数保留一年呢?哎哟 我将假设
计数
将视图id
作为其主键。然后有另一个表ranks
,其中包含列view\u id
(设置为FK进入counts
)、rank
(概括d1-d7,不管它们是什么数据类型)和rank\u 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允许在更新查询中使用连接类型语法。我相信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周的行,但在更灵活的模式中,您不必这样做。更新需要20分钟的表有多大?我们可以看到您的表模式吗计数表中还有什么,即它的粒度是多少,你说的有多少条记录更新后会进行一次表扫描。如果不更改表结构,就无法对查询本身进行任何更改以加快查询速度。(不确定是否可以通过调整事务日志来提高速度。)您可以将ID和d1-d7字段拉到另一个表中,或者您可以按照下面的答案中的建议进行规范化(尽管您需要进行测试,看看后者是否会使事情变得更好或更糟)。谢谢。我的表目前大约有550万行。它目前还存储总的“查看次数”,但我可以将其移动到另一个表中,然后只保留上周排名的项目-更少。我的经验让我害怕,但每周10万的排名可能不会那么慢。谢谢你的新观点!