MongoDB w jakiś sposób łączy klucz złożony i używa go jako klucza w BTree.
Podczas wyszukiwania pojedynczych elementów - kolejność węzłów w drzewie nie ma znaczenia.
Jeśli zwracasz zakres węzłów - elementy znajdujące się blisko siebie będą znajdować się w tych samych gałęziach drzewa. Im bliżej węzłów znajdują się w zasięgu, tym szybciej można je odzyskać.
Z jednym indeksem pola - kolejność nie ma znaczenia. Jeśli są blisko siebie w porządku rosnącym, będą również blisko siebie w porządku malejącym.
Kiedy masz klucz złożony - kolejność zaczyna mieć znaczenie.
Na przykład, jeśli klucz to A rosnąco B rosnąco, indeks może wyglądać mniej więcej tak:
Rząd AB
1 1 1
2 2 6
3 2 7
4 3 4
5 3 5
6 3 6
7 5 1
Zapytanie o A rosnąco B malejąco będzie wymagało przeskoczenia po indeksie w niewłaściwej kolejności, aby zwrócić wiersze, i będzie wolniejsze. Na przykład zwróci Row1, 3, 2, 6, 5, 4, 7
Zapytanie zasięgowe w tej samej kolejności co indeks po prostu zwróci wiersze sekwencyjnie we właściwej kolejności.
Znalezienie rekordu w BTree zajmuje O (Log (n)) czasu. Znalezienie szeregu rekordów w kolejności to tylko OLog (n) + k, gdzie k to liczba rekordów do zwrócenia.
Jeśli rekordy są niesprawne, koszt może sięgać nawet OLog (n) * k
1, 3, 2, 6, 5, 4, 7
?Prosta odpowiedź , że szukasz jest to, że kierunek ma znaczenie tylko podczas sortowania na dwóch lub więcej pól .
Jeśli sortujesz według
{a : 1, b : -1}
:Indeks
{a : 1, b : 1}
będzie wolniejszy niż indeks{a : 1, b : -1}
źródło
{a: -1, b: -1}
, czy mam{a: -1, b: -1}
indeks, czy{a: 1, b: 1}
wystarczy.{a: 1, b: 1}
indeks powinien wystarczyć, ponieważ całkowite odwrócenie indeksu jest w porządku. np. Index on{a: 1}
może być użyty do sortowania{a: -1}
Dlaczego indeksy
Zrozum dwa kluczowe punkty.
Indeksy nie są darmowe. Zabierają pamięć i nakładają spadek wydajności podczas wstawiania, aktualizacji i usuwania. Zwykle wpływ na wydajność jest pomijalny (zwłaszcza w porównaniu ze wzrostem wydajności odczytu), ale to nie znaczy, że nie możemy sprytnie tworzyć naszych indeksów.
Jak Indexes
Określenie, która grupa pól powinna być razem indeksowana, polega na zrozumieniu wykonywanych zapytań. Kolejność pól używanych do tworzenia indeksu ma kluczowe znaczenie. Dobra wiadomość jest taka, że jeśli pomylisz się w zamówieniu, indeks nie będzie w ogóle używany, więc łatwo będzie go znaleźć za pomocą wyjaśnienia.
Dlaczego sortowanie
Twoje zapytania mogą wymagać sortowania. Ale sortowanie może być kosztowną operacją, dlatego ważne jest, aby traktować pola, według których sortujesz, tak jak pole, którego dotyczy zapytanie. Więc będzie szybciej, jeśli ma index. Jest jednak jedna ważna różnica, sortowane pole musi być ostatnim polem w indeksie. Jedynym wyjątkiem od tej reguły jest to, że jeśli pole jest również częścią zapytania, reguła musi być ostatnią nie ma zastosowania.
Jak sortować
Możesz określić sortowanie dla wszystkich kluczy indeksu lub podzbioru; jednak klucze sortowania muszą być wymienione w tej samej kolejności, w jakiej pojawiają się w indeksie. Na przykład wzorzec klucza indeksu {a: 1, b: 1} może obsługiwać sortowanie na {a: 1, b: 1}, ale nie na {b: 1, a: 1}.
Sortowanie musi określać ten sam kierunek sortowania (tj. Rosnąco / malejąco) dla wszystkich swoich kluczy co wzorzec klucza indeksu lub określać odwrotny kierunek sortowania dla wszystkich swoich kluczy jako wzorzec klucza indeksu. Na przykład wzorzec klucza indeksu {a: 1, b: 1} może obsługiwać sortowanie na {a: 1, b: 1} i {a: -1, b: -1}, ale nie na {a: -1 , b: 1}.
Załóżmy, że istnieją te indeksy:
źródło
{ a: 1, b: 1, c: 1 }
, czy naprawdę potrzebujesz indeksów{ a: 1}
i{ a: 1, b: 1}
czy indeks{ a: 1, b: 1, c: 1 }
obejmuje wszystkie sprawy? Jeśli zapytania zawsze używają tego samego sortowania: 1 nie sortuje w zapytaniu z -1