我在一个存储过程中使用以下查询来获取用户的排名。
在尝试优化数据库时,我试图确定此查询是否可以优化,因为它是我的数据库中最常用的查询。
id column被索引
SELECT
@p_rank = all_time_rank
FROM
(SELECT
user_rankings.*,
RANK() OVER (ORDER BY score DESC) AS all_time_rank
FROM
user_rankings) t
WHERE
id = @p_id;
是否有办法让这个查询执行得更好?
你可以这样表达:
SELECT @p_rank = COUNT(*) + 1
FROM user_rankings ur
WHERE ur.score > (SELECT ur2.score FROM user_rankings ur2 WHERE ur2.id = @pid);
您需要user_rankings(id, score)
和user_rankings(score)
的索引。