0

Django プロジェクトで実行された SQL クエリを改善 (キャッシング、再構築など) できるように、実行された SQL クエリのレビューを開始しました。

たとえば、データベースから単一のオブジェクトを取得するには、次のようにします。

Company.objects.filter(pk=1)[:1]

より高速:

Company.objects.filter(pk=1)

前者ではルックアップの数を制限しているためです。これは明らかですが、ForeignKey であるモデルのプロパティにアクセスするときに制限を設定する方法はあまり明白ではありません。たとえば、がto CompanyCompanyModelを持つモデルで、メイン モデルからいくつかのプロパティにアクセスしようとするとします。OneToOneField

test = Company.objects.filter(pk=1)[:1]
profile = test.CompanyProfile.owner

CompanyProfile に関する情報を取得するために実行されるクエリには制限がないため、テーブル全体を走査してできるだけ多くのレコードを検索します。そうならないように制限を設定するにはどうすればよいですか?

4

1 に答える 1

0

あなたの「最適化」は明らかではありません。私はそれが最適化でさえあることに非常に懐疑的です。

データベースは一般に、特にこのような単純なケースでは、クエリの最適化に非常に優れています。主キーを介してデータベースにレコードを要求すると、データベース全体をスキャンするのではなく、その列のインデックスを使用します。そのインデックスは適切です。そのため、データベースが一致しないレコードに遭遇するとすぐに、スキャンを停止します。そのクエリを制限する必要はまったくありません。

外部キー検索についてもまったく同じことが言えます。FK は所有者テーブルの主キーを指します。この場合も、データベースは最初の一致しないキーまでスキャンするだけで済みます。

于 2014-12-19T09:52:16.293 に答える