djangoの組み込みのページネーションは、便利ですが、慎重に実装されていなければ、大きなデータセットのパフォーマンスの問題につながる可能性があります。主な犯人は、完全なテーブルスキャンの可能性です。 最適化されていないquerySetを使用してPaginator
を使用すると、Djangoはデータベースからすべての行を取得する前に、ページにスライスする可能性があります。これは非効率的であり、特に何百万ものレコードを使用して、応答時間を大幅に遅くします。 完全なテーブルスキャンを回避するには、データベースクエリが要求されたページに必要な行を取得することを確認する必要があります。 これには、データベースレベルのページネーション機能を使用することが含まれます。これには、SQLクエリにおよびLIMIT
条項が活用されます。 Django's ORMは、これを行う方法を、最も効果的にOFFSET
とQuerySet.offset()
を通じて、または複雑なシナリオに必要に応じて適切なQuerySet.limit()
>および
QuerySet
メソッド(例えば、ページネーションを適用する前にクエリセット全体を繰り返します)は、ページネーションの目的とパフォーマンスのパフォーマンスのパフォーマンスを打ち負かします。ページネーションには関連モデルが含まれ、プリフェッチまたはselect_relatedを使用していません。ページ上の各オブジェクトに多数の追加データベースクエリを作成することになります(関連データを取得するためにオブジェクトごとに1つのクエリ)。 Paginator
を使用して使用すると、ページネーションを適用する前にデータセット全体をフェッチすることにつながる可能性があります。これは非常に効率的ではありません。データベースクエリでは、およびPaginator
は、データベースからすべてのデータを取得し、パジネーションのパフォーマンスの利点を無効にします。効率的なページネーションのためのDjangoモデルとクエリ?
WHERE
ページネーションクエリのQuerySet.order_by()
QuerySet.select_related()
QuerySet.prefetch_related()
生のSQL(必要に応じて):QuerySet
複雑なページネーションシナリオの場合は、データベースの相互作用をきめんゆい制御のためにQuerySet.offset()
QuerySet.limit()
キャッシング:LIMIT
キャッシュ戦略(たとえば、DjangoのキャッシュフレームワークまたはRedisのような専用のキャッシュソリューションを使用する)を実装して、頻繁にアクセスしたペジインドデータを保存します。 Djangoの大規模なデータセットを使用したページネーションは、これらのベストプラクティスに従ってください。
LIMIT
を使用して、現在のページに必要なデータのみを取得します。 ボトルネックを識別するためにクエリをプロファイルします。OFFSET
以上がDjangoのページングクエリは非効率的ですか?データベースのフルテーブルスキャンを避ける方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。