在Django中优化数据库查询

时间:2012-12-07 18:54:47

标签: django

我有一些代码导致我的页面加载速度很慢(在128毫秒内有49个查询)。这是我网站的目标网页 - 因此需要快速加载。

以下是我的views.py,它在网站上创建了最新更新的订阅源,并且导致从调试工具栏中看到的最慢的加载时间:

def product_feed(request):
    """ Return all site activity from friends, etc. """
    latestparts = Part.objects.all().prefetch_related('uniparts').order_by('-added')
    latestdesigns = Design.objects.all().order_by('-added')
    latest = list(latestparts) + list(latestdesigns)
    latestupdates = sorted (latest, key = lambda x: x.added, reverse = True)
    latestupdates = latestupdates [0:8]
    # only get the unique avatars that we need to put on the page so we're not pinging for images for each update
    uniqueusers = User.objects.filter(id__in = Part.objects.values_list('adder', flat=True))
    return render_to_response("homepage.html", {
    "uniqueusers": uniqueusers,
    "latestupdates": latestupdates
    }, context_instance=RequestContext(request))

导致最多时间的查询似乎是:

  latest = list(latestparts) + list(latestdesigns) (25ms)

我还在调查另外一个17ms(全站点通知)和25ms(在每个产品供稿上添加标记项目)。

有没有人看到我可以通过哪种方式优化活动Feed的加载?

3 个答案:

答案 0 :(得分:1)

您永远不需要超过8个项目,因此请限制您的查询。并且不要忘记确保两个模型is indexed中的added

latestparts = Part.objects.all().prefetch_related('uniparts').order_by('-added')[:8]
latestdesigns = Design.objects.all().order_by('-added')[:8]

对于奖励分数,消除幻数。

答案 1 :(得分:0)

将这些查询提高一点后,您可能需要查看memcache以存储最常见的查询结果。

答案 2 :(得分:0)

此外,我相信adderForeignKeyUser模型。

Part.objects.distinct().values_list('adder', flat=True)

以上行是QuerySet,其中包含唯一的addre值。我相信你的确如此。

它可以节省你执行一个子程序。