2012-01-12 11 views
1

私が持っている場合:Djangoのクエリ効率

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

1.「効率的」とはどういう意味ですか? 2.あなたが「時間」と測定したとき、あなたは何を見ましたか? 3. SQL出力(https://docs.djangoproject.com/en/1.3/topics/logging/#id1)にログを記録したとき、あなたは何を確認しましたか? –

+0

1)まあ、私が本当に求めているのは、より良いことですか?おそらく、最小の時間を取るか、おそらく最小の計算を取ることを意味します。私はどちらが正直にもっと重要かわからない。 2)「時間」とは何ですか?それをグーグル(または "Django time it")とはあまり役に立たなかった。しかし、私はそれをテストするための大きなデータセットを持っていない、私はうまくいけばサイトを構築している! 3)出力を記録しなかった!私は総SQLのnewbです、それは始めるのが良い場所のようです...ありがとう。 –

+0

1.より効率的な定義ができない場合は、何が重要かわかりません。 「良い」とは何も意味しません。最適化しようとしているものが必要です。質問にそれを述べてください。 2. http://docs.python.org/library/timeit.html。 3.質問を結果に更新**してください。 –

答えて

4

同じQuerySetが構築されなければなりません、それは同じでなければなりません。 1ではなく3つのメソッド呼び出しのために小さな違いがあるかもしれませんが、データベースクエリ時間までは違いは見られません。

違いがある場合は、どこかにバグがある可能性があります。

1

後者のクエリは、私のテストで前者の時間の約3分の1を要します。

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', 
    city__iexact='somewhere', 
    timezone__iexact='est')", 
    "from shows.models import TimeZip" 
).timeit(1000) 

0.4363691806793213秒の時間をもたらした

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

は、1.2074651718139648秒の時間になりました。

かなり大きな違い!