我的Django应用程序中的一个大而且不断增长的表需要更好的性能策略

时间:2015-11-27 06:52:35

标签: python django performance postgresql

对于来自发展中经济体的首次互联网用户,我非常基本的非js支持移动电话设备和不稳定的互联网覆盖,我主持一个简单的基于Django的留言板。

此留言板的“主页”是主要演出。这是每个人都可以直接写任何东西的地方。此外,用户不断刷新此页面,看看是否有其他用户出现过任何新内容(重读);将该地方视为公共聊天室。

这个主页由一个大表(> 1M行)和不断增长的表(每天增加10K;加速)提供。它由 views.py 中基于类的ListView表示。我碰巧只需要这个大表中的最新~200行(按'-id'排序),因为我的用户不会深入挖掘过去。因此,在CBV中,queryset = Post.objects.order_by('-id').exclude(submitter_id__in=condemned)[:200]condemnedhell-bannedsubmitterUser外键的用户。此外,get_context_data()中还发生了大量其他内容。

根据新文物,这个CBV是我在我的应用程序中最耗时的视图。在大桌面上运行SELECT需要花费最多的时间。我无法缓存主页,因为用户将此留言板视为准聊天。

我可以以不同的方式构建该查询集切片,或者这是我能做的最好的吗?根据您的经验,您认为我应该采取哪些措施来改善CBV的性能?我愿意分享更多信息,所以如果需要请求。我的db是postgresql。

2 个答案:

答案 0 :(得分:1)

将我的评论移至答案

我认为花费时间最长的是订购。

来自order_by的文档:

  

订购不是免费操作。您添加到订单中的每个字段都会导致数据库损失。

根据您的查询判断,您根本不需要order_by,可以像在评论中那样从对面采取

Post.objects.exclude(submitter_id__in=condemned)[200:]

默认情况下,这将是一个模型ordering,order_by使用的模型Meta类是id

唯一可能产生影响的事情取决于condemned是什么,我希望它也是一个查询集,但如果不是(即在文本文件中读取一些内容),我会调查一下还

因为你说过被判刑是从values_list派生的名单。

values_list可能无法帮助我不会因为我认为它会解析查询,您可能想要尝试使用.all.values('id')。值返回ValuesQuerySet,如果我没有弄错,则不会解析查询。我没有查看value_list返回的内容

编辑:我刚查看并且values_list返回ValuesListQuerySet,显然字典查找(values使用)会比列表查找更快

答案 1 :(得分:0)

您需要在PostgreSQL的submitter_id字段上创建索引。 此外,如果您希望用户立即查看消息,您可以使用Meteor DDP for django,简而言之,它将通过分布式数据协议公开对象集合,然后在前端MeteorJS将捕获更改并显示新消息而无需重新加载(它使用套接字)。试试我在ioaware.meteor.com上写的应用程序,我在2天内创建了它,只需注册并添加课程,并在单独的浏览器中查找此过程