Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql表格设计,每日轮换最高评级_Mysql_Sql_Query Optimization_Rating - Fatal编程技术网

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万的排名可能不会那么慢。谢谢你的新观点!