如何优化此用户排名查询

时间:2010-12-23 02:56:13

标签: php mysql query-optimization

我有2个数据库(用户,userRankings),系统需要每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可能是有益的。)

2 个答案:

答案 0 :(得分:0)

尝试这样的东西,它应该给你相同的效果,而不需要建立一个单独的表。 (我的MySql有点生疏,但这应该可以正常工作)

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

答案 1 :(得分:0)

实际占用大部分时间的是哪个查询?我打赌它是第三个。

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

SELECT a.rank, b.rank 
FROM users a, userRankings b
WHERE a.id = b.userid

Explain可以帮助您调试索引的使用方式。

你应该做的第一件事是删除那个旧的table1,table2语法。它很难读,而且效率很低。你应该总是使用JOIN。

UPDATE users AS a
JOIN userRankings AS b ON a.id = b.userid
SET a.rank = b.rank

这可能会解决您的问题 - 希望EXPLAIN可以帮助您缩小具体问题的范围。确保两个列(users.id和userRankings.userid)完全相同(例如,其中一个未签名而另一个未签名)。

要获得更多帮助,您需要发布更多数据(每个表的SHOW CREATE TABLE结果,运行时每个查询的时间长度,表中的行数)。

相关问题