ホームページ  >  記事  >  バックエンド開発  >  Django フレームワークにおける ORM 最適化のヒント

Django フレームワークにおける ORM 最適化のヒント

PHPz
PHPzオリジナル
2023-06-17 11:57:581231ブラウズ

Django の ORM (Object-Relational Mapping) 機能は、人気のある Python Web フレームワークとして Web 開発で広く使用されており、開発者はデータベースを直接操作せずに Python オブジェクトを使用してデータベースを操作できます。ただし、データ量が増加すると、ORM のパフォーマンスが低下する可能性があります。したがって、この記事では、アプリケーションのパフォーマンスを向上させるための Django ORM 最適化のヒントをいくつか紹介します。

  1. .select_popular() を使用する

Django ORM の .select_popular() メソッドは、すべての関連オブジェクトのデータをプリロードできるため、データベースへの複数のクエリを回避できます。デフォルトでは、ORM を使用してデータベースにクエリを実行する場合、Django はメイン モデルからのみデータをフェッチします。モデルに 1 つ以上の外部キーがある場合、.select_popular() を通じてすべての外部キー オブジェクトを取得できます。たとえば、

books = Book.objects.select_related('publisher').all()

上のコードでは、Books モデルに外部キーの発行者があり、関連する発行者モデルを選択すると、1 つのクエリですべての関連データを取得できます。これにより、後続のクエリでデータベースに繰り返しアクセスすることが回避され、パフォーマンスが向上します。

  1. .prefetch_popular() を使用する
#.select_popular() と同様に、.prefetch_popular() メソッドは、複数のデータを回避するために、指定されたモデルのデータをメモリにプリロードすることもできます。データベースクエリ。違いは、.prefetch_relative() メソッドが多対多の逆関連付けと他のモデル間のアクセスに使用されることです。例:

publishers = Publisher.objects.prefetch_related('books').all()

上記のコードでは、Publisher モデルには逆関連付けの書籍があります。 .prefetch_popular () を使用すると、すべてのパブリッシャーを一度に取得でき、複数のデータベース クエリのオーバーヘッドを回避できます。

    .values() および .values_list() を使用する
Django ORM の .values() および .values_list() メソッドを使用して、次のデータを収集できます。指定されたモデルをリストに追加することで、データベース クエリの数が削減されます。たとえば、

authors = Author.objects.all().values('name', 'email')

上記のコードでは、作成者の名前と電子メールを取得するだけで済み、.values() メソッドを使用して結果を一度に取得できます。

    ループ クエリの置換
Django ORM では、ループ クエリを通じて複数のデータを取得する方法がパフォーマンスのボトルネックを引き起こす可能性があります。たとえば、次のコードでは多くのデータベース クエリが発生します:

for author in Author.objects.all():
    books = author.books.all()
    # do something with the books

対照的に、.prefetch_relative() メソッドを使用してループ クエリを置き換え、データベース クエリを減らすことができます:

authors = Author.objects.prefetch_related('books')
for author in authors:
    # get books from prefetched related
    books = author.books.all()
    # do something with the books

上記ではコードでは、 .prefetch_popular() メソッドを使用して本の著者のデータをプリロードし、データベース アクセスの数を減らします。

    データベース インデックスの使用
Django ORM は、クエリを高速化するためのデータベース インデックスの使用をサポートしています。インデックスを使用すると、指定された列に従ってデータベース内のデータを並べ替えることができるため、クエリ プロセスがより効率的になります。 Django では、モデルの Meta クラスを使用してインデックスを定義できます。例:

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)

    class Meta:
        indexes = [
            models.Index(fields=['title'], name='title_index'),
            models.Index(fields=['author'], name='author_index'),
        ]

上記のコードでは、title 列と author 列に基づいてクエリを実行する 2 つのインデックスを定義します。

    データベース接続プール
Django ORM では、データベース接続は高価なリソースです。したがって、データベース接続プールを使用して一連の接続を維持し、データベース接続のオーバーヘッドを削減できます。 Django アプリケーションの場合、Django-dbconn-reuse モジュールを使用してデータベース接続プーリングを実装できます。インストール後、次のコードを Django の settings.py ファイルに追加して接続プールを有効にするだけです:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mydatabase',
        'USER': 'mydatabaseuser',
        'PASSWORD': 'mypassword',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'OPTIONS': {
            'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
            'conn_max_age': 60,
            'charset': 'utf8mb4',
            'pool_size': 5
        }
    }
}

上記のコードでは、MySQL データベースを使用し、接続プール サイズを 5 接続に設定しました。

結論

Django アプリケーションでは、ORM はアプリケーションとデータベース間の対話プロセスを大幅に簡素化できる非常に強力な機能です。上記のヒントと最適化を使用して ORM のパフォーマンスを向上させると、この強力な機能をさらに活用してアプリケーションのパフォーマンスと信頼性を向上させることができます。

以上がDjango フレームワークにおける ORM 最適化のヒントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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