Эффективность запросов Django - PullRequest
1 голос
/ 13 января 2012

Если у меня есть:

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')

ИЛИ

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

Ответы [ 2 ]

4 голосов
/ 13 января 2012

То же самое QuerySet должно быть построено, поэтому оно должно быть таким же.У вас могут быть небольшие различия из-за 3 вызовов метода вместо 1, но что касается времени запроса базы данных, вы не увидите никакой разницы.

Если есть разница, где-то может быть ошибка.

2 голосов
/ 14 января 2012

Последний запрос занимает примерно 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 секунд.

Довольно существенная разница!

...