对于使用非常基本、不支持 js 的移动电话设备和不稳定的互联网覆盖的发展中经济体的首次互联网用户,我提供了一个简单的基于 Django 的留言板。
此留言板的“主页”页面是主要页面。这是每个人都可以直接写任何东西的地方。此外,用户不断刷新此页面以查看其他用户是否出现了任何新内容(阅读量很大);把这个地方当作公共(public)聊天室。
这个主页由一个很大(>100 万行)并且不断增长(>10K 每天增加;加速)的表格提供。它由 views.py 中基于类的 ListView 表示。我碰巧只需要这个大表中的最新的 ~200 行(按 '-id'
排序),因为我的用户不会深入研究过去。因此在 CBV 中,queryset = Post.objects.order_by('-id').exclude(submitter_id__in=condemned)[:200]
(condemned
是 hell-banned 的用户, submitter
是一个 User
外键)。此外,get_context_data()
中还发生了一大堆额外的事情。
根据 new-relic,此 CBV 是迄今为止我的应用程序中最耗时的 View 。在大表上运行 SELECT
花费的时间最多。我无法缓存主页,因为用户将此留言板视为类聊天。
我能否以不同的方式构建查询集切片,或者这是我能做的最好的?根据你的经验,你认为我应该做些什么来提高这个 CBV 的性能?我愿意分享更多信息,所以如果需要,请离开。我的数据库是 postgresql。
最佳答案
将我的评论移到答案中
我认为花费时间最长的是订购。
来自 order_by
的文档:
Ordering is not a free operation. Each field you add to the ordering incurs a cost to your database.
根据您的查询判断,您根本不需要 order_by 并且可以像您在评论中所做的那样从另一端获取
Post.objects.exclude(submitter_id__in=condemned)[200:]
默认情况下,order_by 使用的模型元类中的模型 ordering
是 id
。
唯一可能产生影响的另一件事取决于 condemned
是什么,我希望它也是一个查询集,但如果不是(即在文本文件中读取的一些)我会也调查一下。
既然你已经说过 decneded 是从 values_list
派生的列表。
values_list
可能无济于事我不认为因为我认为它解决了查询,您可能想尝试使用 .all
或只是 .values ('id')
。 Values 返回一个 ValuesQuerySet
,如果我没记错的话,它不会解析查询。我还没有研究 values_list 返回的内容
编辑:我刚看过 values_list
返回一个 ValuesListQuerySet
,显然字典查找(values
使用)会更快比列表查找
关于python - 我的 Django 应用程序中一个不断增长的大表需要更好的性能策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33951737/