Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.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
Php 如何优化此用户排名查询_Php_Mysql_Query Optimization - Fatal编程技术网

Php 如何优化此用户排名查询

Php 如何优化此用户排名查询,php,mysql,query-optimization,Php,Mysql,Query Optimization,我有两个数据库用户,一个需要每10分钟更新一次排名的系统的用户排名。我使用下面的代码来更新这些排名,效果相当不错,但是仍然需要进行完整的表格扫描,这会减慢几十万用户的速度 mysql_query("TRUNCATE TABLE userRankings"); mysql_query("INSERT INTO userRankings (userid) SELECT id FROM users ORDER BY score DESC"); mysql_query("UPDATE users a,

我有两个数据库用户,一个需要每10分钟更新一次排名的系统的用户排名。我使用下面的代码来更新这些排名,效果相当不错,但是仍然需要进行完整的表格扫描,这会减慢几十万用户的速度

mysql_query("TRUNCATE TABLE userRankings");
mysql_query("INSERT INTO userRankings (userid) SELECT id FROM users ORDER BY score DESC");
mysql_query("UPDATE users a, userRankings b SET a.rank = b.rank WHERE a.id = b.userid");

在userRankings表中,rank是主键,userid是索引。这两个表都是MyISAM,我想知道将userRankings设置为InnoDB是否有益。

尝试类似的方法,不需要构建单独的表就可以获得相同的效果。我的MySql有点生锈,但这应该可以正常工作

select @rownum:=@rownum+1 ‘rank’, a.id 
from player a, (SELECT @rownum:=0) r 
order by score desc 

哪个查询实际上占用了大部分时间?我打赌这是第三个

通过将查询转换为SELECT来对其进行基准测试:

SELECT a.rank, b.rank 
FROM users a, userRankings b
WHERE a.id = b.userid
可以帮助您调试索引的使用方式

您应该做的第一件事是删除旧的table1、table2语法。它很难阅读,而且效率很低。您应该始终使用连接

UPDATE users AS a
JOIN userRankings AS b ON a.id = b.userid
SET a.rank = b.rank
这可能会解决你的问题-希望解释能帮助你缩小具体问题的范围。确保users.id和userRankings.userid列的类型与中的完全相同,例如,其中一个未签名,而另一个未签名


要获得更多帮助,您需要发布更多数据,显示每个表的创建表结果、运行每个查询所需的时间、表中的行数。

我使用EXPLAIN查看它没有正确优化,但我无法找到更有效的优化方法。正如你所建议的,我试着用一个连接来实现它,但是没有什么区别。好吧,现在你有了一个更好的问题:你的查询没有使用索引,你认为应该这样做。为了解决下一步的问题,您应该使用SHOW CREATE TABLE yourtable的结果更新您的问题,并解释[your select query]。这只是选择了用户,而且它确实按照他们的排名顺序选择了他们,我如何使用它来更新他们的排名?为什么需要更新排名?如果此查询返回所需的数据,是否确实需要物理存储可能频繁更改的排名值。如果您的用户只需要查看排名的用户,只需使用此查询。是否有其他系统要求实际排名表不能用此查询替换?我不仅显示总排名列表,还显示特定用户的排名以及特定用户范围。SET@rownum=0;UPDATE users JOIN SELECT@rownum:=@rownum+1 AS rank,id FROM users ORDER BY score DESC AS o USINGid SET users.rank=o.rankYou还可以创建一个视图,将a.id替换为*,然后查询该视图,尽管像上面那样一次性更新表会提高视图的性能。。。