Redsandro,
Sie müssen die Index Cardinality
berücksichtigen und Selectivity
.
1. Indexkardinalität
Die Indexkardinalität bezieht sich darauf, wie viele mögliche Werte es für ein Feld gibt. Das Feld sex
hat nur zwei mögliche Werte. Es hat eine sehr niedrige Kardinalität . Andere Felder wie names, usernames, phone numbers, emails
usw. haben für jedes Dokument in der Sammlung einen eindeutigeren Wert, was als hohe Kardinalität angesehen wird .
-
Größere Kardinalität
Je größer die Kardinalität eines Felds ist, desto hilfreicher ist ein Index, da Indizes den Suchraum einschränken und ihn zu einer viel kleineren Menge machen.
Wenn Sie einen Index zu
sex
haben und Sie suchen nach Männern namens John. Sie würden den Ergebnisbereich nur um ungefähr %50 einschränken, wenn Sie nachsex
indizieren Erste. Umgekehrt, wenn Sie nachname
indexiert haben , würden Sie die Ergebnismenge sofort auf einen winzigen Bruchteil von Benutzern mit dem Namen John eingrenzen und dann auf diese Dokumente verweisen, um das Geschlecht zu überprüfen. -
Faustregel
Versuchen Sie, Indizes mit
high-cardinality
zu erstellen Tasten oder setzen Siehigh-cardinality
Schlüssel zuerst im zusammengesetzten Index. Sie können mehr darüber im Abschnitt über zusammengesetzte Indizes im Buch lesen:MongoDB, der endgültige Leitfaden
2. Selektivität
Außerdem möchten Sie Indizes selektiv verwenden und Abfragen schreiben, die die Anzahl der möglichen Dokumente mit dem indizierten Feld begrenzen. Um es einfach zu halten, betrachten Sie die folgende Sammlung. Wenn Ihr Index {name:1}
ist , Wenn Sie die Abfrage { name: "John", sex: "male"}
ausführen . Sie müssen 1
scannen dokumentieren. Weil Sie MongoDB erlaubt haben, selektiv zu sein.
{_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}
Betrachten Sie die folgende Sammlung. Wenn Ihr Index {sex:1}
ist , Wenn Sie die Abfrage {sex: "male", name: "John"}
ausführen . Sie müssen 4
scannen Dokumente.
{_id:ObjectId(),name:"John",sex:"male"}
{_id:ObjectId(),name:"Rich",sex:"male"}
{_id:ObjectId(),name:"Mose",sex:"male"}
{_id:ObjectId(),name:"Sami",sex:"male"}
{_id:ObjectId(),name:"Cari",sex:"female"}
{_id:ObjectId(),name:"Mary",sex:"female"}
Stellen Sie sich die möglichen Unterschiede bei einem größeren Datensatz vor.
Eine kleine Erklärung von zusammengesetzten Indizes
Es ist leicht, falsche Annahmen über zusammengesetzte Indizes zu treffen. Laut MongoDB-Dokumentation zu zusammengesetzten Indizes.
MongoDB unterstützt zusammengesetzte Indizes, bei denen es sich um eine einzelne Indexstruktur handelt enthält Verweise auf mehrere Felder innerhalb der Dokumente einer Sammlung. Das folgende Diagramm zeigt ein Beispiel für einen zusammengesetzten Index auf zwei Feldern:
Wenn Sie einen zusammengesetzten Index erstellen, 1 Index enthält mehrere Felder. Wenn wir also eine Sammlung nach {"sex" : 1, "name" : 1}
indizieren , sieht der Index ungefähr so aus:
["male","Rick"] -> 0x0c965148
["male","John"] -> 0x0c965149
["male","Sean"] -> 0x0cdf7859
["male","Bro"] ->> 0x0cdf7859
...
["female","Kate"] -> 0x0c965134
["female","Katy"] -> 0x0c965126
["female","Naji"] -> 0x0c965183
["female","Joan"] -> 0x0c965191
["female","Sara"] -> 0x0c965103
Wenn wir eine Sammlung nach {"name" : 1, "sex" : 1}
indizieren , sieht der Index ungefähr so aus:
["John","male"] -> 0x0c965148
["John","female"] -> 0x0c965149
["John","male"] -> 0x0cdf7859
["Rick","male"] -> 0x0cdf7859
...
["Kate","female"] -> 0x0c965134
["Katy","female"] -> 0x0c965126
["Naji","female"] -> 0x0c965183
["Joan","female"] -> 0x0c965191
["Sara","female"] -> 0x0c965103
{name:1}
haben da das Präfix Ihnen viel besser bei der Verwendung zusammengesetzter Indizes dient. Es gibt noch viel mehr zu diesem Thema zu lesen, ich hoffe, dies kann etwas Klarheit schaffen.