ホームページ >バックエンド開発 >Python チュートリアル >select_relative と prefetch_relative は Django ORM クエリをどのように最適化しますか?

select_relative と prefetch_relative は Django ORM クエリをどのように最適化しますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-23 22:54:29435ブラウズ

How Do select_related and prefetch_related Optimize Django ORM Queries?

Django ORM の select_関連付けと prefetch_関連付けを理解する

Django では、select_popular と prefetch_関連付けは、データベース クエリを最適化し、パフォーマンスを向上させるために使用される 2 つの手法です。どちらもテーブルを「結合」して関連データを取得する必要がありますが、その方法は異なります。

select_popular: SQL クエリでの結合

select_popular は SQL JOIN を実行します。単一のクエリですべての関連データを取得します。これにより結果セットは大きくなりますが、追加のクエリが不要になるため処理速度が速くなります。これは、ForeignKey リレーションシップなど、関連オブジェクトが 1 つまたは少数しか存在しないリレーションシップに最適です。一方、SQL クエリ内のテーブルを結合しません。代わりに、関連オブジェクトの主キー (ID) のみをフェッチし、個別のクエリを実行して Python で実際のデータを取得します。これにより SQL クエリが小さくなりますが、追加のクエリが必要になります。これは、ManyToManyFields や逆ForeignKeys など、関連するオブジェクトが多数あるリレーションシップに適しています。

Python 表現の違い

もう 1 つの重要な違いは、関連オブジェクトの Python 表現。 select_relative を使用すると、関連オブジェクトごとに Python で重複オブジェクトが作成されます。対照的に、prefetch_popular は、単一のオブジェクトを使用して各関連オブジェクトを表すため、メモリを節約できます。

使用ガイドライン

原則として、必要な関係には select_関連付けを使用します。少数の関連オブジェクトを取得します。多数の関連オブジェクトとの関係の場合は、prefetch_popular を使用します。

次の Django モデルを考えてみましょう。

すべてをフェッチするにはselect_popular を使用して、それぞれの著者と出版社を含む書籍を取得するには:

prefetch_popular を使用して、それぞれの書籍を含むすべての著者を取得するには:

<code class="python">class Publisher(models.Model):
    name = models.CharField(max_length=255)

class Author(models.Model):
    name = models.CharField(max_length=255)
    publisher = models.ForeignKey(Publisher)

class Book(models.Model):
    title = models.CharField(max_length=255)
    author = models.ForeignKey(Author)</code>

prefetch_popular の例では、Book オブジェクトはすぐには取得されません。 Author オブジェクトで使用できます。代わりに、書籍を取得するには author.book_set に明示的にアクセスする必要があります。

<code class="python">books = Book.objects.select_related('author', 'author__publisher').all()</code>
プロジェクトに最適なアプローチは、特定の要件とデータの特性によって異なることに注意してください。両方の手法を試して、どちらが最適なパフォーマンスをもたらすかを判断することをお勧めします。

以上がselect_relative と prefetch_relative は Django ORM クエリをどのように最適化しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。