我有一个排行榜,其中有一个“得分”列.我在得分列上也有一个索引,这使得我可以非常快速地按分数排序表,甚至可以分数前十或任意数量的分数 – 即使有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总计每天更新一次.