MongoDB verkettet den zusammengesetzten Schlüssel auf irgendeine Weise und verwendet ihn als Schlüssel in einem BTree.
Beim Suchen einzelner Elemente - Die Reihenfolge der Knoten im Baum spielt keine Rolle.
Wenn Sie eine Reihe von Knoten zurückgeben - Die Elemente, die nahe beieinander liegen, befinden sich in denselben Zweigen des Baums. Je näher die Knoten im Bereich sind, desto schneller können sie abgerufen werden.
Mit einem einzelnen Feldindex - Die Reihenfolge spielt keine Rolle. Wenn sie in aufsteigender Reihenfolge nahe beieinander liegen, sind sie auch in absteigender Reihenfolge nahe beieinander.
Wenn Sie einen zusammengesetzten Schlüssel haben - Die Reihenfolge spielt eine Rolle.
Wenn der Schlüssel beispielsweise A aufsteigend B aufsteigend ist, sieht der Index möglicherweise folgendermaßen aus:
Reihe AB
1 1 1
2 2 6
3 2 7
4 3 4
5 3 5
6 3 6
7 5 1
Eine Abfrage für A aufsteigend B absteigend muss in der falschen Reihenfolge um den Index springen, um die Zeilen zurückzugeben, und ist langsamer. Zum Beispiel wird Row zurückgegeben1, 3, 2, 6, 5, 4, 7
Eine Bereichsabfrage in derselben Reihenfolge wie der Index gibt die Zeilen einfach nacheinander in der richtigen Reihenfolge zurück.
Das Finden eines Datensatzes in einem BTree benötigt O (Log (n)) Zeit. Das Finden eines Bereichs von Datensätzen in der Reihenfolge ist nur OLog (n) + k, wobei k die Anzahl der zurückzugebenden Datensätze ist.
Wenn die Datensätze nicht in Ordnung sind, können die Kosten bis zu OLog (n) * k betragen
1, 3, 2, 6, 5, 4, 7
?Die einfache Antwort , nach der Sie suchen, ist, dass die Richtung nur wichtig ist, wenn Sie nach zwei oder mehr Feldern sortieren .
Wenn Sie sortieren nach
{a : 1, b : -1}
:Der Index
{a : 1, b : 1}
ist langsamer als der Index{a : 1, b : -1}
quelle
{a: -1, b: -1}
, sollte ich einen{a: -1, b: -1}
Index haben oder{a: 1, b: 1}
wird dies ausreichen ?{a: 1, b: 1}
Index ausreichen, da das vollständige Invertieren eines Index in Ordnung ist. zB Index on{a: 1}
kann für eine Sortierung verwendet werden{a: -1}
Warum Indizes?
Verstehe zwei wichtige Punkte.
Indizes sind nicht kostenlos. Sie belegen Speicherplatz und führen zu Leistungseinbußen beim Einfügen, Aktualisieren und Löschen. Normalerweise ist der Leistungseinbruch vernachlässigbar (insbesondere im Vergleich zu Verbesserungen der Leseleistung), aber das bedeutet nicht, dass wir beim Erstellen unserer Indizes nicht klug sein können.
Wie Indizes
Um festzustellen, welche Gruppe von Feldern zusammen indiziert werden soll, müssen Sie die von Ihnen ausgeführten Abfragen verstehen. Die Reihenfolge der Felder, die zum Erstellen Ihres Index verwendet werden, ist entscheidend. Die gute Nachricht ist, dass der Index bei falscher Reihenfolge überhaupt nicht verwendet wird, sodass es leicht zu erklären ist.
Warum sortieren?
Ihre Abfragen müssen möglicherweise sortiert werden. Das Sortieren kann jedoch eine teure Operation sein. Daher ist es wichtig, die Felder, nach denen Sie sortieren, wie ein Feld zu behandeln, das Sie abfragen. Es wird also schneller sein, wenn es einen Index hat. Es gibt jedoch einen wichtigen Unterschied: Das Feld, das Sie sortieren, muss das letzte Feld in Ihrem Index sein. Die einzige Ausnahme von dieser Regel besteht darin, dass die Must-be-last-Regel nicht gilt, wenn das Feld auch Teil Ihrer Abfrage ist.
Wie sortieren
Sie können eine Sortierung für alle Schlüssel des Index oder für eine Teilmenge angeben. Die Sortierschlüssel müssen jedoch in derselben Reihenfolge aufgelistet werden, in der sie im Index angezeigt werden. Beispielsweise kann ein Indexschlüsselmuster {a: 1, b: 1} eine Sortierung nach {a: 1, b: 1} unterstützen, jedoch nicht nach {b: 1, a: 1}.
Die Sortierung muss für alle Schlüssel dieselbe Sortierrichtung (dh aufsteigend / absteigend) wie das Indexschlüsselmuster oder für alle Schlüssel die umgekehrte Sortierrichtung als Indexschlüsselmuster angeben. Beispielsweise kann ein Indexschlüsselmuster {a: 1, b: 1} eine Sortierung nach {a: 1, b: 1} und {a: -1, b: -1} unterstützen, jedoch nicht nach {a: -1 , b: 1}.
Angenommen, es gibt diese Indizes:
quelle
{ a: 1, b: 1, c: 1 }
brauchen Sie wirklich Indizes{ a: 1}
und /{ a: 1, b: 1}
oder Index{ a: 1, b: 1, c: 1 }
deckt alle Fälle ab? Wenn Abfragen immer dieselbe Sortierung verwenden: 1 Keine Sortierungen in Abfrage mit -1