我有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可能是有益的。)
答案 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结果,运行时每个查询的时间长度,表中的行数)。