网易首页 > 网易号 > 正文 申请入驻

Django用户排名:3种方案里只有1个能扛住10万并发

0
分享至


去年有个做健身App的朋友跟我吐槽,说他们 leaderboard 功能上线第一天就崩了。用户量才5万,查询排名平均耗时800毫秒,高峰期直接超时。问题出在哪?他们用了一个"看起来对"的方案——先查用户分数,再数有多少人比他高。这在测试环境跑10个用户当然没问题,但生产环境就是另一回事了。

这种场景太常见了。排行榜、积分系统、竞技匹配,几乎每个产品都会遇到"算排名"的需求。Django ORM 给了你好几种实现方式,但它们的性能差距能达到100倍以上。今天把三种主流方案拆开看,包括一个很多人没注意到的 Django 2.0 隐藏武器。

方案一:窗口函数,Django 2.0 埋了3年的大招

这是唯一能在单条 SQL 里搞定全表排名的方案。

Django 2.0 引入的 Window 函数,本质上是在 ORM 层封装了 SQL 的窗口函数。写法很干净:

from django.db.models import F, Window
from django.db.models.functions import Rank

users_with_rank = User.objects.annotate(
rank=Window(
expression=Rank(),
order_by=F('points').desc()
)
)

Window 类告诉 Django 生成 OVER 子句,Rank() 处理排名逻辑,F('points').desc() 确保分数高的排前面。整条查询只访问一次数据库,返回结果里每个用户都带上了 rank 字段。

Rank() 的计分规则跟标准 SQL 一致:并列分数共享同一名次,下一名次跳过。比如 Alice 和 Bob 都是200分,并列第1,Carol 180分直接跳到第3。如果你不希望跳号,把 Rank() 换成 DenseRank(),Carol 就会变成第2名。


窗口函数在 PostgreSQL、MySQL 8.0+、SQLite 3.25+ 都支持,但有个坑:旧版 MySQL 5.7 会报错。如果你的项目还在用古董数据库,这方案直接排除。

方案二:计数法,新手陷阱

这个方案的思路很直观:数一下有多少人分数比你高,再加1就是你的排名。

specific_user = User.objects.get(id=2)
user_rank = User.objects.filter(points__gt=specific_user.points).count() + 1

代码确实好懂,不需要 import 额外的东西。但代价是两次数据库往返——先取用户,再计数。查一个人的排名还好,如果要在 leaderboard 页面展示前50名,你得循环查50次,变成51条查询。

更隐蔽的问题是并列处理。假设 Alice 和 Bob 同分,先查 Alice 的排名时,系统认为有0人比她高,排第1;查 Bob 时,Alice 已经被算进去了,Bob 变成第2。同一个分数出现两个排名,用户看到会懵。

我那个做健身App的朋友用的就是这个方案。5万用户时,单条排名查询要扫描半张表,索引都救不了。

方案三:子查询,折中但啰嗦

用子查询可以在单条 SQL 里算出单个用户的排名,比计数法少一次往返:


from django.db.models import OuterRef, Subquery, Count

user_rank = User.objects.filter(
points__gt=OuterRef('points')
).values('points').annotate(cnt=Count('pk')).values('cnt')

User.objects.annotate(rank=user_rank + 1)

但子查询的写法明显更绕,而且数据库优化器不一定会把它处理得高效。PostgreSQL 通常能优化好,MySQL 的表现在版本差异很大。窗口函数能做的事,没必要用子查询硬凑。

生产环境怎么选

直接给结论:

• 数据库支持窗口函数 → 无脑用方案一,Rank() 或 DenseRank() 看业务需求
• 困在 MySQL 5.7 或更老的版本 → 考虑升级数据库,比改代码划算
• 实在动不了数据库 → 方案二加缓存,但得接受并列排名的混乱

有个细节很多人忽略:窗口函数返回的是查询集,你可以继续链式操作。比如只取前100名、按地区过滤、或者把排名和用户信息一起序列化,都不会触发额外查询。

Django 官方文档对 Window 函数的示例很少,Stack Overflow 上相关讨论也不多。这功能从2.0到现在已经6年了,但据我观察,实际项目中使用率不到三成。可能是名字起得太技术,很多人看到 Window 就跳过了。

你现在的项目里,排名功能用的是哪种方案?如果今天重写,你会换吗?

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
十年前,易建联花1000万在洛杉矶买下豪宅,如今出售市值多少?

十年前,易建联花1000万在洛杉矶买下豪宅,如今出售市值多少?

小兰聊历史
2026-04-26 08:44:22
菲律宾搁浅船事件的惊人解决方案:填海造地与战略围困

菲律宾搁浅船事件的惊人解决方案:填海造地与战略围困

晓徙娱乐
2026-05-02 04:03:25
14岁儿子得抑郁症,花光30万没治好,老公上去一巴掌:装什么病

14岁儿子得抑郁症,花光30万没治好,老公上去一巴掌:装什么病

千秋文化
2026-04-25 20:39:20
网曝一只金毛在主人示意下跳入湖中扑咬天鹅宝宝,天鹅父母拼命展翅驱赶

网曝一只金毛在主人示意下跳入湖中扑咬天鹅宝宝,天鹅父母拼命展翅驱赶

观威海
2026-05-02 12:28:28
大暴雨、11级大风!今天进入最强时段

大暴雨、11级大风!今天进入最强时段

新浪财经
2026-05-02 12:26:13
佩杜拉丨热苏斯在1月转投阿莱格里经纪人旗下

佩杜拉丨热苏斯在1月转投阿莱格里经纪人旗下

米兰圈
2026-05-02 09:24:38
2-1,3-1!足坛疯狂1夜!意甲两队遗憾降级,英超再生变

2-1,3-1!足坛疯狂1夜!意甲两队遗憾降级,英超再生变

林子说事
2026-05-02 09:22:11
特斯拉官网上线新优惠,降价 8000 元!

特斯拉官网上线新优惠,降价 8000 元!

花果科技
2026-05-01 21:30:31
亏损6900亿?本田访华后放弃电动转型,社长坦言:赢不了,不干了

亏损6900亿?本田访华后放弃电动转型,社长坦言:赢不了,不干了

谷盟1
2026-05-02 12:44:27
人称北京现金王雷军,手握千亿却不帮一把王健林?背后真相太现实

人称北京现金王雷军,手握千亿却不帮一把王健林?背后真相太现实

混沌录
2026-04-29 19:25:06
以色列总统拒赦免!内塔尼亚胡贪腐案认罪倒计时,最高判10年!

以色列总统拒赦免!内塔尼亚胡贪腐案认罪倒计时,最高判10年!

长星寄明月
2026-05-02 13:44:10
72歲肥媽照肺「有粒嘢」欲賣樓出埠,病後變瘦氣喘揭吸氧能力低

72歲肥媽照肺「有粒嘢」欲賣樓出埠,病後變瘦氣喘揭吸氧能力低

粤睇先生
2026-05-01 22:40:52
杨子离婚 3个月就和新欢产子,黄圣依17年青春喂了狗,体面尽失

杨子离婚 3个月就和新欢产子,黄圣依17年青春喂了狗,体面尽失

橙星文娱
2026-04-29 10:30:58
台高层已抵达非洲,大陆彻底看清:特朗普的“最坏打算”是什么

台高层已抵达非洲,大陆彻底看清:特朗普的“最坏打算”是什么

喊山的姑娘
2026-05-02 12:58:03
AI做出“黑神话:潘金莲”!大雷美女夯爆了

AI做出“黑神话:潘金莲”!大雷美女夯爆了

游民星空
2026-04-29 20:04:13
钱再多也没用!企业家李建宏去世,死因曝出,最后动态停在3天前

钱再多也没用!企业家李建宏去世,死因曝出,最后动态停在3天前

花小猫的美食日常
2026-05-02 00:40:45
明天起横财天降、桃花主动上门!这3个生肖小心被幸福砸晕了!

明天起横财天降、桃花主动上门!这3个生肖小心被幸福砸晕了!

毅谈生肖
2026-05-02 10:58:42
牛肉顶多注个水猪肉顶多催个肥,唯有三文鱼全程cosplay

牛肉顶多注个水猪肉顶多催个肥,唯有三文鱼全程cosplay

富贵说
2026-04-14 23:15:09
康宁汉姆32+10+3+4无缘今日最佳球员!因为詹姆斯28+7+8创3项纪录

康宁汉姆32+10+3+4无缘今日最佳球员!因为詹姆斯28+7+8创3项纪录

Tracy的篮球博物馆
2026-05-02 12:43:53
人民日报:换主食抗炎6周见效!研究发现:肠道菌群是“调节器”

人民日报:换主食抗炎6周见效!研究发现:肠道菌群是“调节器”

肠菌科普
2026-04-29 09:17:59
2026-05-02 14:47:00
赛博兰博
赛博兰博
专注捣鼓AI效率工具,试图在这个时代留下数字分身的探索者。
2065文章数 26关注度
往期回顾 全部

科技要闻

AI热潮耗尽库存,Mac Mini起售调高200美元

头条要闻

牛弹琴:默茨称美国被"羞辱"后 特朗普的报复马上就到

头条要闻

牛弹琴:默茨称美国被"羞辱"后 特朗普的报复马上就到

体育要闻

休赛期总冠军,轮到休斯顿火箭

娱乐要闻

白百何罕晒大儿子 18岁元宝越来越帅

财经要闻

雷军很努力 小米还是跌破了30港元大关

汽车要闻

新纪录!零跑汽车4月交付达71387台

态度原创

房产
亲子
旅游
健康
军事航空

房产要闻

所有户型全卖爆!海口TOP级豪宅,景观样板间五一全线开放!

亲子要闻

带伊朗小姑子圆梦烤肉,好吃的连生菜都不放过,小卷毛又馋面条了

旅游要闻

古韵遇科技 越夜越精彩|“夜无棣”引爆五一假期文旅新热潮

干细胞治烧烫伤面临这些“瓶颈”

军事要闻

特朗普:对伊战事结束 无限期延长停火

无障碍浏览 进入关怀版