Django查询效率

时间:2012-01-12 21:59:08

标签: django django-queryset django-orm

如果我有:

class Address(models.Model):
    state = models.CharField(max_length=2)
    city = models.CharField(max_length=50)
    street = models.CharField(max_length=50)

和一个更有效的大型数据集:

Address.objects.filter(state__exact='xx').filter(city__exact='somewhere').filter(street__exact='some street')

OR

Address.objects.filter(state__exact='xx', city__exact='somewhere', street__exact = 'some_street')

2 个答案:

答案 0 :(得分:4)

应该构造相同的QuerySet,因此它应该是相同的。由于3个方法调用而不是1,您可能会有微小的差异,但就数据库查询时间而言,您将看不到任何差异。

如果存在差异,可能会在某处出现错误。

答案 1 :(得分:2)

在我的测试中,后一个查询大约占前者的1/3。

使用包含11,695个条目的模型。

class TimeZip(models.Model):
    zipcode = models.SlugField(max_length=5)
    timezone = models.IntegerField(default=-5)
    state = models.CharField(max_length=2)
    city = models.CharField(max_length=50)

然后测试:

Timer("TimeZip.objects.filter(state__iexact='xx')\
     .filter(city__iexact='somewhere')\
     .filter(timezone__iexact='est')",
     "from shows.models import TimeZip"
).timeit(1000)

导致 1.2074651718139648 秒的时间,而

Timer("TimeZip.objects.filter(state__iexact='xx',
     city__iexact='somewhere',
     timezone__iexact='est')",
     "from shows.models import TimeZip"
).timeit(1000)

导致时间 0.4363691806793213 秒。

相当显着的差异!