如何从MySQL和PHP的500万行记分板中获得排名?

我有一个排行榜,其中有一个“得分”列.我在得分列上也有一个索引,这使得我可以非常快速地按分数排序表,甚至可以分数前十或任意数量的分数 – 即使有500万行!

但是,我真正想要的是在排行榜中显示球员“排名”.我已经尝试了一些方法,但是当处理超过100000行时,它们似乎都没有堆叠(它们开始占用超过半秒,考虑到我期待数百名cuncurrent用户,这太长了).

我目前正在使用以下查询来确定一个用户的排名,然后在我的输出中为这些用户增加simlpy – 但这很慢.

SELECT  tro.score, tro.userId,  
(
    SELECT  count(*) 
    FROM    scoreboard tri
    WHERE   tri.score >= :score
) AS rank
FROM test_tracks tro
WHERE userId = :userID");

我正在考虑生成一个排名表,以便在他们将新分数插入记分板时“缓存”用户排名,但即使生成这个也需要很长时间(分钟,可能是几小时).

有谁知道建立排名的任何好的指南或技巧?我希望能够对结果进行总结,但即使只是暂时建立排名也足够了!

提前致谢!

解决方法:

执行此操作的最佳方法是使用一个定期更新的表(每小时一次,每天一次等),这可以通过一个可以进行更长时间查询并运行它的计划.没有必要一直用这些繁重的查询来粉碎数据库.这也意味着长时间运行的查询会一次运行,而不是每个浏览该页面的用户都运行.

一个完美的例子就是SO,其中weekly/monthly/yearly总计每天更新一次.

上一篇:mysql 数据库插入语句之insert into,replace into ,insert ignore


下一篇:BZOJ 1703. [Usaco2007 Mar]Ranking the Cows 奶牛排名