MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie wirkt sich die Reihenfolge der zusammengesetzten Indizes in MongoDB auf die Leistung aus?

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 nach sex indizieren Erste. Umgekehrt, wenn Sie nach name 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 Sie high-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.