Wie funktioniert die Bestellung von zusammengesetzten Indizes Materie in MongoDB performance-wise?
Benötigen wir zum erstellen eines zusammengesetzten index in der gleichen Reihenfolge wie die Parameter abgefragt werden. Tut dies, um Materie leistungsmäßig überhaupt?
Sich vorstellen, wir haben eine Sammlung von allen Menschen auf der Erde mit einem index auf sex
(99,9% der Zeit als "Männlich" oder "weiblich", aber die string-nichtsdestotrotz (nicht Binär)) und ein index für name
.
Wenn wir wollen, frei wählen können alle Menschen einer bestimmten sex
mit einer bestimmten name
z.B. alle "männlichen"s namens "John", ist es besser, einen zusammengesetzten index mit sex
ersten oder name
ersten? Warum (nicht)?
- Ich glaube nicht, dass die Bestellung Angelegenheiten performance-Weise, aber Wiederverwendung-Weise - beim erstellen eines zusammengesetzten index "- name, sex", kann der index wieder verwendet werden, wenn die Abfrage "name" nur (aber nicht für "sex" nur) - beziehungsweise, wenn Sie erstellen einen zusammengesetzten index "Geschlecht, name", der index kann wieder verwendet werden, wenn Abfragen "sex" nur (aber nicht für den "Namen" nur).
- Wird Sie jemals haben, um Sie zu Sortieren?
- nicht diese Tasten
- Es hängt wirklich von Ihrer Nutzung. Mong hat eine Menge von Optionen auf, wie man mit Indizes. Sie können definieren zusammengesetzte Indizes oder einzelne Indizes; Mongo schneiden einzelne Indizes in anderen, um die Abfrage ausführen. Es gibt auch andere Konzepte, wie ein index zur Deckung Ihrer Abfrage, die einige Einschränkungen haben. Also es kommt wirklich auf jede spezifische Abfrage, die Sie wollen und Ihre erwarteten document format. Können Sie uns mehr details über Ihren Fall?
- Diese Frage ist nicht eine betrogene, die andere Frage auch "MongoDB verkettet wird der zusammengesetzte Schlüssel in irgendeiner Weise" ist das nicht ein sehr gute Antwort, und die Antwort ist eine Art von Recht (wäre für normal zusammengesetzte Bildung von Indizes), aber auch nicht
- Bestellung Fragen viele, vor allem, wenn die bestimmte Operatoren verwenden, wie in$, zum Beispiel: blog.mongolab.com/2012/06/cardinal-ins
Du musst angemeldet sein, um einen Kommentar abzugeben.
Redsandro,
Müssen Sie berücksichtigen,
Index-Kardinalität
undSelektivität
.1. Index-Kardinalität
Index Kardinalität bezieht sich darauf, wie viele mögliche Werte gibt es für ein Feld. Der Bereich
sex
hat nur zwei mögliche Werte. Es hat eine sehr niedrige Kardinalität. Andere Felder wienames, usernames, phone numbers, emails
usw. eine eindeutiger Wert für jedes Dokument in der Sammlung, die als hohe Kardinalität.Größere Kardinalität
Desto größer ist die Kardinalität von einem Feld, das mehr hilfreich ein index werden, da Indizes, die die Suche einzugrenzen Raum, so dass es eine viel kleinere Gruppe.
Wenn Sie über einen index auf
sex
und Sie sind auf der Suche für Männer namens John. Sie würde nur eingrenzen das Ergebnis Raum von etwa %50, wenn Sie indiziert istsex
ersten. Umgekehrt, wenn Sie indiziert istname
, Sie würde sofort eingrenzen der Ergebnismenge auf einen winzigen Bruchteil der Benutzer namens John, dann würden Sie beziehen sich auf diejenigen Dokumente, zu schauen das Geschlecht.Faustregel
Versuchen, erstellen von Indizes auf
high-cardinality
Schlüssel oder setzenhigh-cardinality
keys erst in den zusammengesetzten index. Sie können mehr darüber Lesen Sie im Abschnitt zusammengesetzte Indizes im Buch:MongoDB The Definitive Guide
2. Selektivität
Auch, das Sie verwenden möchten Indizes selektiv und schreiben von Abfragen, die Begrenzung der Zahl der möglichen Dokumente, die mit dem indizierten Feld. Um es einfach zu halten, betrachten Sie die folgende Auflistung. Wenn Ihr index ist
{name:1}
, Wenn Sie die Abfrage ausführen{ name: "John", sex: "male"}
. Sie müssen scan1
Dokument. Denn Sie erlaubt MongoDB, wählerisch zu sein.Betrachten Sie die folgende Auflistung. Wenn Ihr index ist
{sex:1}
, Wenn Sie die Abfrage ausführen{sex: "male", name: "John"}
. Sie müssen scan4
Dokumente.Stellen Sie sich die möglichen Unterschiede auf einen größeren Datensatz.
Eine kleine Erklärung der Zusammengesetzten Indizes
Es ist leicht zu machen die falsche Annahme über Zusammengesetzte Indizes. Nach MongoDB docs auf Zusammengesetzte Indizes.
Beim erstellen eines zusammengesetzten index, 1 Index halten mehrere Felder. Also, wenn wir uns index eine Sammlung von
{"sex" : 1, "name" : 1}
ist, wird der index Aussehen, in etwa so:Wenn wir uns index eine Sammlung von
{"name" : 1, "sex" : 1}
ist, wird der index Aussehen, in etwa so:Dass
{name:1}
als Präfix Sie dienen viel besser in die Verwendung von zusammengesetzten Indizes. Es ist viel mehr gelesen werden kann zu dem Thema, ich hoffe, das bieten einige Klarheit.field_a == index_a && field_b == index_b
, wo die Reihenfolge ja egal, was ich auch vermutet, weil es Sinn macht eine Schleife durch die Auflistung nur einmal.) Gibt es eine Quelle, um dies zu überprüfen?2dsphere
index (jedes Dokument mit einer einzigartigen Lage, Daten) haben eine hohe Kardinalität und sollte daher in Erster Linie in der index/query? Und wie würde die Kardinalität eines$nin
Feld bestimmt werden?Werde ich sagen, ich Tat ein experiment, auf das ich, und gefunden, dass es anscheinend keine Leistungseinbußen für die Verwendung von schlecht definierten index-Taste. (Ich bin mit mongodb 3.4 mit wiredtiger, welcher ein anderer sein kann als mmap). Ich steckte 250 Millionen Dokumente in eine neue Sammlung namens
items
. Jeder doc sah so aus:"field1"
war immer gleich"bob"
."field2"
war gleichi
, so war es völlig eindeutig ist. Zuerst habe ich eine Suche auf Feld2, und es dauerte über eine minute, um scan 250 Millionen Dokumente. Dann erstellte ich eine index-wie so:Natürlich Feld1 "bob" auf jedes einzelne Dokument, so sollte der index zu suchen haben, eine Reihe von Gegenstände zu finden, bevor das gewünschte Dokument. Dies war jedoch nicht das Ergebnis, das ich bekam.
Habe ich eine weitere Suche auf die Sammlung, nachdem der index fertig erstellt. In dieser Zeit bekam ich die Ergebnisse, die ich unten aufgelistet. Sie werden sehen, dass
"totalKeysExamined"
1 jedes mal. Also vielleicht mit WLAN-tiger oder etwas, was Sie herausgefunden haben, wie das besser zu tun. Ich habe gelesen, die wiredtiger tatsächlich komprimiert index Präfixe, so dass möglicherweise etwas damit zu tun.db.items.find({field1:"bob",field2:"250888000"}).explain("executionStats")
Dann erstellte ich einen index auf
field3
(die hat den gleichen Wert wie Feld 2). Dann habe ich gesucht:db.Elemente.find({feld3:"250888000"});
Nahm es die gleichen 4ms als die mit dem zusammengesetzten index. Ich wiederholte dies mehrmals mit verschiedenen Werten für Feld2 und feld3 und bekam unbedeutende Unterschiede jedes mal. Dies deutet darauf hin, dass mit wiredtiger, gibt es keine Leistungseinbußen für die schlechte Differenzierung auf das erste Feld eines Indexes.
keysExamined
bedeutet hier die Anzahl der unterschiedlichen Indizes, sah es an-es bedeutet nicht, dass die Anzahl der Teile des index, der es anschaut. Ich denke, einen Unterschied zwischen den beiden index-Bestellungen werden unglaublich klein im Vergleich zu der gesamten Zeit, die zum abrufen des Dokuments, so dass, wenn wir wollten, um eine wirkliche Vorstellung von den Unterschied in der Leistung, wir wollen zum ausführen eines load-Test-Skript über eine ziemlich lange Zeit.