消除django中不必要的数据库命中

时间:2009-10-17 04:08:11

标签: sql django orm

我想在django中工作时减少实际的数据库命中,所以我创建了这个人工示例来概述问题。该模型如下所示:

class Car(models.Model):
    name = models.CharField(max_length=10)
    user = models.ForeignKey(User)

在我看来,我想做这样的事情:

def cartest(request):
    cars = Car._default_manager.filter(user__username__exact='michael')[:5]
    first_car_name = cars[0].name
    another_car = cars[1]
    return HttpResponse(len(connection.queries))

所以我想从数据库中选择5个条目,用第一个条目做一些事情,然后用第二个做一些事情(记住这是一个人为的例子)。必须有一些方法可以做到这一点,而不是两次击中数据库,对吗?

谢谢, 麦克

2 个答案:

答案 0 :(得分:2)

啊,想通了......这达到了预期的效果。问题是订阅查询集而不是迭代它(或调用列表(queryset))。只访问数据库一次:

def cartest(request):
    cars = list(Car._default_manager.filter(user__username__exact='michael')[:5])
    first_car_name = car[0]
    another_car = car[1]
    return HttpResponse(len(connection.queries))

答案 1 :(得分:1)

您是否实际遇到了性能问题,或者您只关心应用程序未来的可伸缩性?

正如Tim Wardle所说previously,不要试图过早地优化。利用节省的开发时间,Django可以让您更快地将应用程序推出门外。一旦你有用户,然后看看你的瓶颈是否正在尝试修复它们。

但是,如果您实际遇到性能问题,我会查看Queryset对update multiple objects at once和获取数据in bulk的能力。

至少one rejected ticket我知道这可能会帮助你(取决于你的数据库系统)。

你总是可以将Django的ORM拉出来并用SQLAlchemy替换它。

This post(可能是NSFW)有一些关于制作高性能Django应用程序的指针。

詹姆斯·贝内特(James Bennett)总体上对缩放有一些好处,其中一些约为ORM performance