オブジェクト リレーショナル マッピング (ORM) を使用すると、SQL データベースとの対話が簡単になりますが、非効率的で生の SQL よりも遅いとも考えられています。
ORM を効果的に使用するには、ORM がデータベースにクエリを実行する方法を理解する必要があります。この記事では、Django ORM システムを効果的に使用して中規模から大規模のデータ セットにアクセスする方法に焦点を当てます。
Django のクエリセットは、オプションのクエリでフィルタリングされた、データベース内の複数のレコード (行) に対応します。たとえば、次のコードはデータベース内の「Dave」という名前のすべての人物を取得します:
1 |
|
上記のコードはデータベース クエリを実行しません。 person_set を使用したり、フィルタ条件を追加したり、関数に渡したりすることができます。これらの操作はデータベースに送信されません。データベース クエリは Web アプリケーションのパフォーマンスに大きな影響を与える要素の 1 つであるため、これは正しいことです。
実際にデータベースからデータを取得するには、queryset:
1 2 |
|
クエリセットを反復処理すると、一致するすべてのレコードがデータベースから取得され、Django モデルに変換されます。これを評価といいます。これらのモデルはクエリセットの組み込みキャッシュに保存されるため、クエリセットを再度反復処理する場合に、同じ一般的なクエリを再度実行する必要はありません。
たとえば、次のコードはデータベース クエリのみを実行します:
1 2 3 4 5 6 7 |
|
クエリセット キャッシュの最も便利な点は、クエリセットにデータが含まれているかどうかを効果的にテストできることです。データが存在する場合にのみスキャンされます。 すべてのデータが必要ない場合は、クエリセットのキャッシュに問題がある可能性があります
これを回避するには、exists() メソッドを使用してデータがあるかどうかを確認できます:
1 2 3 4 5 6 |
|
クエリセットが非常に大きい場合、キャッシュが問題になります
データの走査中にクエリセット キャッシュが生成されないようにするには、 iterator() メソッドを使用してデータを取得し、データの処理後にそれを破棄します。
りーもちろん、キャッシュの生成を防ぐために iterator() メソッドを使用すると、同じクエリセットを走査するときにクエリが繰り返し実行されることになります。したがって、 iterator() を使用するときは注意し、大規模なクエリセットを操作するときにコードがクエリを繰り返し実行しないようにしてください
クエリセットが大きい場合、if ステートメントが問題になります
最も簡単な解決策は、exists() を iterator() と組み合わせて使用し、2 つのデータベース クエリを使用してクエリセット キャッシュの使用を回避することです。
りーより複雑な解決策は、Python の「高度な反復メソッド」を使用して、ループを開始する前に iterator() の最初の要素を調べてから、ループするかどうかを決定することです。
りー不適切な最適化を防ぐ
プログラムのメモリ使用を最適化するには、exists() メソッドと iterator() メソッドを使用します。ただし、クエリセット キャッシュは生成されないため、追加のデータベース クエリが発生する可能性があります。
したがって、プログラムの速度が低下し始めた場合は、コードのどこにボトルネックがあるのか、役立つ小さな最適化があるかどうかを確認する必要があります。
以上がDjango の QuerySet を効果的に使用するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。