2012-01-12 4 views
1

Если у меня есть:Джанго эффективность запроса

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

1. Что вы подразумеваете под «эффективным»? 2. Когда вы измеряли «время», что вы видели? 3. Когда вы зарегистрировали выход SQL (https://docs.djangoproject.com/en/1.3/topics/logging/#id1), что вы видели? –

+0

1) Ну, что я действительно спрашиваю, что лучше? Возможно, я имею в виду, что занимает наименьшее количество времени или, возможно, наименьшее вычисление. Я не знаю, что важнее честно. 2) Что такое «время»? Googling it (или «Django time it») не помогло. Но у меня нет большого набора данных, чтобы проверить его, я строю сайт, который, надеюсь, будет! 3) Я не регистрировал выход! Я полный SQL-сервер, который кажется хорошим местом для начала ... спасибо. –

+0

1. Если вы не можете определить более эффективное, мы не знаем, что для вас важно. «Лучше» тоже ничего не значит. У вас должно быть что-то, что вы пытаетесь оптимизировать. Говори его в вопросе, пожалуйста. 2. http://docs.python.org/library/timeit.html. 3. Пожалуйста, ** уточните ** вопрос с результатами. –

ответ

4

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

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

1

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

Довольно значительная разница!

Смежные вопросы