2017-07-26 79 views
6

Wiem tylko, że indeksowanie jest pomocne i szybciej sprawdza.Indeksowanie indeksów pól modelu Django

Jaka jest różnica między następującymi dwoma?

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',]), 
] 

Odpowiedz

3

Pierwszy przykład tworzy indeks dla pola first_name i osobny indeks dla pola last_name.

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

To będzie przydatna, jeśli nie na podstawie wyszukiwań imienia lub nazwiska w kodzie

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

Drugi przykład tworzy jeden indeks na polu last_name i first_name.

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

Będzie to przydatne, jeśli szukać na nazwisko i imię razem lub nazwisko przez siebie (bo last_name jest pierwsze pole w indeksie).

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

Jednak to nie będzie przydatna dla szukając first_name przez siebie (bo first_name nie jest pierwsze pole w indeksie).

MyModel.objects.filter(first_name=first_name) 
1

Django model Index został wprowadzony w Django 1.11

co jest Model.indexes:

Domyślnie indeksy są tworzone z rosnącej kolejności dla każdej kolumny. Aby zdefiniować indeks z malejącą kolejnością dla kolumny, dodaj łącznik przed nazwą pola.

Dla zapytaniu models.Index(fields=['last_name', 'first_name','-date_of_birth',]), stworzyłoby SQL z (last_name, first_name, date_of_birth DESC).

przejdźmy do pytania,

pytasz różnicę między 2 zapytaniami,

zarówno odbędzie models.Index(fields=['-date_of_birth',]),

ponieważ co najmniej jeden zastąpi przypisane zmienne. z twojego najmniejszego pytania jest dateofbirth, więc zastąpi on powyżej dwóch linii.

tak jak na dokumentacji metoda jest korzystna, ponieważ pole indeksowanie powinny być w jednej listy .. więc Django przygotuje SQL indeksowania z listy pól ...

models.Index(fields=['last_name', 'first_name', '-date_of_birth']), 
+0

Twoja sugestia będzie utworzyć jeden indeks - że nie będzie przydatny, jeśli PO chce zapytać o imię i datę urodzenia sam. – Alasdair