web-dev-qa-db-ja.com

Django Model Fields Indexing

索引付けが役立つことと、クエリの高速化のみを知っています。

次の2つの違いは何ですか?

1. class Meta:
       indexes = [
           models.Index(fields=['last_name', 'first_name',]),
           models.Index(fields=['-date_of_birth',]),
]

2. class Meta:
       indexes = [
            models.Index(fields=['first_name',]),
            models.Index(fields=['last_name',]),
            models.Index(fields=['-date_of_birth',]),
]
20
ShubhamHAgrawal

最初の例では、last_nameおよびfirst_nameフィールドに単一のインデックスを作成します。

indexes = [
   models.Index(fields=['last_name', 'first_name',]),
]

姓と名を一緒に検索する場合、または姓のみを検索する場合に便利です(last_nameがインデックスの最初のフィールドであるため)。

MyModel.objects.filter(last_name=last_name, first_name=first_name)
MyModel.objects.filter(last_name=last_name)

ただし、first_nameを単独で検索する場合には役立ちません(first_nameはインデックスの最初のフィールドではないため)。

MyModel.objects.filter(first_name=first_name)

2番目の例では、first_nameフィールドにインデックスを作成し、last_nameフィールドに別のインデックスを作成します。

indexes = [
    models.Index(fields=['first_name',]),
    models.Index(fields=['last_name',]),
]

コード内の名または姓に基づいて検索を行う場合に役立ちます

MyModel.objects.filter(first_name=search)
MyModel.objects.filter(last_name=search)
34
Alasdair

Django Model Indexは、Django 1.11で導入されました

Model.indexesとは:

デフォルトでは、インデックスは各列の昇順で作成されます。列の降順でインデックスを定義するには、フィールド名の前にハイフンを追加します。

クエリの場合、models.Index(fields=['last_name', 'first_name','-date_of_birth',]),は_(last_name, first_name, date_of_birth DESC)._でSQLを作成します

質問に移動します

2つのクエリの違いを尋ねましたが、

両方ともmodels.Index(fields=['-date_of_birth',]),を取ります

少なくとも1つが割り当てられた変数をオーバーライドするためです。あなたの質問から少なくともdateofbirthなので、上記の2行を上書きします。

ドキュメントごとに推奨される方法は次のとおりですインデックスフィールドは単一のリストにある必要があるためです。so DjangoはフィールドのリストからSQLインデックスを準備します...

_models.Index(fields=['last_name', 'first_name', '-date_of_birth']),
_