因此,我有一个大型数据库,我想按某个值对其进行排序,例如“ earned_points”,并使用userID在有序表中查找用户的积分。在表中找到用户后,例如,要检索他上方的5个用户和他下方的5个用户,以在我的代码中创建并显示排名表。
现在,我尝试通过创建具有等级的视图表(具有窗口函数:OVER()和row_number()),然后从临时表中选择等级,来完成此操作,
CREATE VIEW temp_table AS
SELECT *, row_number() OVER (ORDER BY earned_points) FROM myTable;
SELECT id FROM temp_table WHERE rank > foundRank - 5 AND rank < foundRank + 5;
,但是整个查询以及创建视图表的过程在我的数据库中都非常缓慢。有什么简单快捷的方法可以做到这一点吗?我需要查询的长度不超过10毫秒。
答案 0 :(得分:0)
在您的特定情况下可能会或可能不会起作用的简单想法:根据当前用户得分附近的窗口进行选择:
SELECT * FROM myTable
WHERE earned_points > current_user_earned_points - X
AND earned_points < current_user_earned_points + X
ORDER BY earned_points
以合理的值X
。这样的想法是,您通常会选择比您需要的人更多的人,但是您只会在玩家附近显示这些人。假设分数分布是线性的,否则您可以选择X
作为earned_points
的函数。
根据表的大小,即使您选择了数十个不必要的条目,这也可能会快很多,因为不需要执行row_number
。
缺点是此方法未给出确切的排名。尽管如果您的表中实际上包含成千上万的玩家,那可能并不重要-您可以计算出一个正确的估计值,并将其显示为用户的“排名”,除非他们接近顶部。
如果还没有,请确保在earned_points
上创建索引。如建议的那样,也许您需要使用INDEXED BY
。在this SO answer中。