‫Jonas: Willkommen zurück.
‫Lassen Sie uns
‫nun ein wenig über die Leseleistung in MongoDB sprechen,
‫warum sogenannte Indizes so wichtig sind und wie
‫wir sie tatsächlich selbst erstellen können.
‫Und ich möchte diese Demonstration über Indizes mit einer
‫einfachen Abfrage auf allen unseren Touren beginnen.
‫Kommen wir also hierher um alle Touren
‫zu bekommen und ich
‫werde auch für einen Preis unter 1.000 filtern.
‫Okay und mal sehen.
‫Ja, wir bekommen also drei Ergebnisse zurück, in Ordnung.
‫Und das ist wichtig zu bedenken
‫für das, was ich Ihnen als nächstes zeigen
‫werde, nämlich dass wir tatsächlich auch ein paar Statistiken über
‫die Abfrage selbst erhalten können.
‫Gehen wir hier also grundsätzlich zur Handler-Funktion.
‫Und so erinnert sich das gerade jetzt in die Handler-Fabrik.
‫Richtig, das ist es also, ich glaube, es
‫ist ganz unten.
‫Ja, also holen Sie sich alle Factory-Funktionen,
‫die diesen Handler erstellen, der
‫für die gerade durchgeführte Abfrage aufgerufen wird.
‫Und hier zur
‫Abfrage füge ich jetzt tatsächlich eine EXPLAIN-Methode hinzu.
‫Okay, nach der Abfrage rufen wir dann "in Ordnung" an.
‫Und schauen wir uns das an.
‫Und so erhalten wir jetzt ein ganz anderes
‫Ergebnis, das im Grunde diese Statistik ist.
‫Jetzt ist viel Zeug drin.
‫Aber
‫was mich wirklich interessiert, sind diese Ausführungsstatistiken, okay.
‫Sie können hier also
‫sehen, dass drei Dokumente zurückgegeben wurden.
‫Und genau das ist das Ergebnis, das wir vorher bekommen haben.
‫Also bevor du das richtig erklärst.
‫Aber was hier wirklich wichtig
‫ist, ist,
‫dass die Anzahl der untersuchten Dokumente neun beträgt, okay.
‫Und das bedeutet, dass MongoDB alle neun
‫Dokumente untersuchen, also im Wesentlichen scannen musste, um
‫die richtigen drei zu finden.
‫Also die drei, die der Abfrage entsprechen, sind in Ordnung.
‫Und das ist also überhaupt nicht effizient, oder?
‫In dieser Größenordnung
‫mit nur neun Dokumenten macht das natürlich keinen Unterschied.
‫Aber wenn wir hier Hunderttausende
‫oder sogar Millionen von Dokumenten hätten,
‫dann würde dies
‫die Leseleistung dieser Abfrage erheblich beeinträchtigen.
‫Auch hier wird dies in dieser Anwendung nicht der Fall sein, aber
‫möglicherweise in einer App, die Sie eines Tages erstellen werden.
‫Sie müssen also wirklich etwas über Indizes lernen.
‫Denn mit Indizes werden
‫wir dieses Problem irgendwie lösen können.
‫So können wir Indizes für bestimmte Felder in einer Sammlung erstellen.
‫Beispielsweise erstellt Mongo standardmäßig automatisch einen
‫Index für das ID-Feld.
‫Und sehen wir uns das tatsächlich in Compass an.
‫Zum Beispiel haben wir hier bei allen Touren die Registerkarte Indizes.
‫Bis zu diesem Zeitpunkt waren wir also nur
‫hier im Dokumenten-Tab,
‫aber wie Sie sehen, haben wir hier viele verschiedene
‫Dinge, und einer davon sind die Indizes.
‫Und so sehen Sie wieder, dass wir standardmäßig einen ID-Index haben.
‫Und dieser ID-Index ist dann im Grunde eine
‫geordnete Liste aller IDs, die irgendwo
‫außerhalb der Sammlung gespeichert werden.
‫Und Sie können hier
‫tatsächlich eine Größe sehen, die 36 Kilobyte hat, dieser Index in Ordnung.
‫Und dieser Index ist äußerst nützlich.
‫Denn wenn Dokumente von
‫der ID abgefragt werden, durchsucht MongoDB diesen geordneten Index, anstatt
‫die gesamte Sammlung zu durchsuchen
‫und alle Dokumente einzeln zu durchsuchen,
‫was natürlich viel langsamer ist.
‫Also wieder ohne Index muss Mongo sich
‫jedes Dokument einzeln ansehen.
‫Aber mit einem Index für das Feld, das
‫wir abfragen, wird dieser Prozess viel effizienter.
‫Das ist also ziemlich schlau, oder?
‫Und natürlich können wir unsere eigenen Indizes für
‫Felder setzen, die wir sehr oft abfragen.
‫Lassen Sie uns das also mit dem
‫Preisfeld machen, nach dem wir gerade
‫abgefragt haben, weil ich glaube, dass es eines der
‫wichtigsten ist, nach dem die Leute fragen, okay.
‫Und so funktioniert es.
‫Wir müssen also direkt zum Tourmodell gehen.
‫Und dann machen wir es gleich hier nach dieser inneren Deklaration
‫und wir sagen tourschema. Index ok.
‫Und dann ein Objekt mit dem Namen des Feldes
‫und denken Sie daran, wie ich sagte,
‫wir würden den Index auf den Preis setzen und dann entweder eine Eins oder eine Minus-Eins.
‫Und eine Eins bedeutet, dass wir den
‫Preisindex in aufsteigender Reihenfolge
‫sortieren, während die Minus-Eins für absteigende Reihenfolge in Ordnung steht.
‫Und es gibt tatsächlich auch andere Arten von Indizes, wie zum
‫Beispiel für Text oder für Geodaten, aber das
‫werden wir etwas später sehen.
‫Okay, speichern wir es jetzt
‫und versuchen Sie unsere Abfrage erneut.
‫Und tatsächlich werde ich es hier ein paar
‫Mal tun, um sicherzustellen, dass der Index wirklich gesetzt ist.
‫Denn manchmal ist es nicht sofort eingestellt.
‫Aber werfen wir jetzt einen Blick hier.
‫Und so bekommen wir zwar immer noch unsere Zahl der
‫zurückgeschickten drei, aber diesmal waren auch
‫nur drei Dokumente, die geprüft, also eingescannt wurden.
‫Und das beweist, dass wir mit diesem
‫Index im Grunde genau das erreicht haben, was wir wollten.
‫Vorher mussten wir also alle neun Dokumente scannen und jetzt
‫muss die Engine nur noch die drei Dokumente scannen,
‫die auch tatsächlich zurückgegeben werden.
‫Und wieder, weil ihre Preise
‫jetzt in diesem Index geordnet sind.
‫Das macht es der MongoDB-Engine
‫viel einfacher und schneller, sie zu finden.
‫Und so ist das natürlich ein enormer Leistungsgewinn.
‫Schauen wir uns jetzt auch Compass hier an und
‫laden wir tatsächlich die gesamte Datenbank neu, und jetzt sollte
‫sie eigentlich hier sein,
‫aber aus irgendeinem Grund ist sie es nicht.
‫Versuchen wir vielleicht, die Dokumente neu zu laden.
‫Vielleicht taucht es dann auf.
‫Nicht wirklich, lassen Sie uns auch das Schema analysieren,
‫und darüber werden
‫wir etwas später sprechen.
‫Aber wie Sie sehen, haben wir immer noch nur diese beiden Indizes.
‫Aber das macht nichts, denn wir wissen
‫ja schon, dass der Index tatsächlich funktioniert, oder?
‫Es ist also
‫völlig normal, dass die Aktualisierung manchmal einige Zeit in Anspruch nimmt.
‫Eine andere Sache, die Sie hier vielleicht bemerken werden,
‫ist, dass dieser ID-Index, über den
‫wir zuvor gesprochen haben, hier eindeutig in Ordnung ist.
‫Und so einzigartig ist auch eine Eigenschaft,
‫die wir Indizes geben können.
‫Und das ist eigentlich der
‫Grund, warum die IDs immer eindeutig sein müssen.
‫Einfach deshalb, weil der
‫Index der ID diese eindeutige Eigenschaft hat.
‫Sie haben wahrscheinlich auch bemerkt, dass es hier einen Index
‫für den Namen gibt, oder?
‫Aber das haben wir nicht selbst manuell erstellt, oder?
‫Können Sie sich vorstellen, warum es hier ist?
‫Das liegt daran, dass wir in unserer Schemadefinition
‫das Namensfeld als eindeutig festgelegt haben.
‫Und was Mongos dann hinter
‫den Kulissen tut, um die Einzigartigkeit dieses Feldes
‫sicherzustellen, ist, einen eindeutigen Index dafür zu erstellen.
‫Aus diesem Grund muss nicht nur die
‫ID, sondern auch der Name immer eindeutig sein.
‫Okay und das ist schon toll.
‫Wenn wir also immer nur ein
‫einzelnes Feld abfragen, ist
‫ein einzelner Feldindex perfekt, denn denken Sie
‫daran, dass der Index, den
‫wir gerade festgelegt haben, als Einzelfeldindex bezeichnet wird.
‫Ich bin mir nicht sicher, ob ich es damals erwähnt habe, aber ich glaube, ich habe es getan.
‫Aber egal, wenn wir manchmal nach diesem Feld
‫fragen, aber mit einem anderen kombinieren,
‫dann ist es tatsächlich
‫effizienter, einen zusammengesetzten Index zu erstellen.
‫Also eines mit zwei Feldern und nicht nur einem.
‫Lassen Sie uns eine Abfrage dafür erstellen, nur um es zu veranschaulichen.
‫Ein weiteres Feld, das
‫meiner Meinung nach ständig abgefragt wird, ist der Bewertungsdurchschnitt.
‫Also durchschnittliche Bewertungen, ich denke, so wird es genannt, und sagen wir, wir
‫wollen größer oder gleich 4 sein. 7 okay.
‫Lassen Sie uns diese Anfrage senden.
‫Und mal sehen, wie viele Ergebnisse wir bekommen.
‫Wo ist das?
‫Ja hier.
‫Die Anzahl der Ergebnisse,
‫also die Anzahl der zurückgegebenen Dokumente,
‫die dieser Abfrage entsprechen, beträgt also zwei.
‫Aber wir mussten noch drei Dokumente prüfen.
‫Und das macht in dieser
‫Größenordnung natürlich keinen Unterschied.
‫Aber wie Sie verstehen, ist dies nur ein Beispiel.
‫Also wollen wir jetzt auch die Situation in Ordnung
‫bringen und verwenden dafür einen zusammengesetzten Index.
‫Gehen wir also hierher zurück.
‫Kommentieren Sie diesen aus.
‫Oder duplizieren Sie es zuerst und kommentieren Sie es dann.
‫Und so ist es eigentlich ganz einfach.
‫Alles, was wir tun müssen, ist, hier das andere Feld hinzuzufügen.
‫Die Bewertungen sind also durchschnittlich und ordnen wir diese in
‫aufsteigender Reihenfolge an.
‫Oder eigentlich ist das die absteigende Reihenfolge.
‫Lassen Sie uns das also speichern.
‫Gehen wir hierher zurück.
‫Und noch einmal, ich werde es hier ein paar Mal tun, okay.
‫Und sehen wir uns unsere Ergebnisse an.
‫Und so bekommen wir jetzt das gewünschte Ergebnis.
‫Es wurden also nur zwei Dokumente
‫gescannt, um die beiden eigentlich gesuchten Dokumente zu finden.
‫Perfekt und tatsächlich wird dieser zusammengesetzte Index, den wir
‫gerade erstellt haben, auch funktionieren, wenn die Abfrage
‫für nur eines dieser beiden Felder hier einzeln, also
‫Preis oder Bewertungen durchschnittlich ist.
‫Wenn wir also einen zusammengesetzten Index wie
‫diesen erstellen, müssen wir nicht
‫auch für jedes der Felder eine Person erstellen.
‫Ich möchte jetzt nur sehen, wie es in Compass aussieht.
‫Aber gut, es sieht immer noch gleich aus.
‫Aber auch hier nicht wirklich wichtig.
‫Eine Sache, die wir hier noch
‫sehen können und die
‫ziemlich interessant ist, ist die tatsächliche Größe dieser Indizes.
‫72 Kilobyte sind also tatsächlich viel größer als
‫die Gesamtgröße aller Dokumente zusammen, die
‫nur 14 Kilobyte beträgt, oder?
‫Im Grunde nehmen diese Indizes, die wir
‫zum Durchsuchen der Dokumente erstellen, viel mehr Platz
‫ein als die Dokumente selbst.
‫Aber auch das liegt daran, dass wir
‫in diesem Beispiel in einem so kleinen Maßstab operieren.
‫Und das ist nicht wirklich relevant, okay.
‫Aber es ist trotzdem wichtig, darüber
‫zu sprechen, denn das führt mich eigentlich zu unserer nächsten Frage.
‫Und diese Frage
‫ist, wie entscheiden wir, welches Feld wir tatsächlich indizieren müssen?
‫Und warum setzen wir nicht für alle Felder Indizes?
‫Nun, wir haben die Strategie verwendet, die ich verwendet
‫habe, um die Indizes auf den Preis und die durchschnittliche Bewertung festzulegen.
‫Im Grunde müssen wir also die Zugriffsmuster unserer Anwendung
‫sorgfältig studieren, um herauszufinden, welche Felder
‫am häufigsten abgefragt werden, und
‫dann die Indizes für diese Felder festlegen.
‫Zum Beispiel setze ich hier keinen Index für die Gruppengröße, weil ich
‫nicht wirklich glaube,
‫dass viele Leute nach diesem Parameter fragen werden, und
‫deshalb muss ich dort keinen Index erstellen.
‫Denn wir wollen es wirklich nicht mit Indizes übertreiben.
‫Wir wollen also nicht blindlings Indizes auf alle Felder setzen und
‫dann im Grunde das Beste hoffen.
‫Und der Grund
‫dafür ist, dass jeder Index tatsächlich Ressourcen
‫verbraucht, wie Sie hier richtig sehen können.
‫Außerdem muss jeder Index jedes Mal aktualisiert werden, wenn
‫die zugrunde liegende Sammlung aktualisiert wird.
‫Wenn Sie also eine Sammlung mit einem hohen Schreib-Lese-Verhältnis haben, also eine
‫Sammlung, in die hauptsächlich geschrieben wird, dann
‫wäre es absolut sinnlos, einen Index
‫für ein beliebiges Feld in dieser Sammlung zu erstellen, da
‫die Kosten für die ständige Aktualisierung des
‫Index und die Beibehaltung es im Speicher überwiegt eindeutig
‫den Vorteil, den Index überhaupt zu haben,
‫wenn wir selten Suchen
‫haben, also Abfragen für diese Sammlung.
‫Zusammenfassend müssen wir also bei der
‫Entscheidung, ob ein bestimmtes Feld indiziert
‫werden soll oder nicht,
‫die Häufigkeit von Abfragen, die genau dieses
‫Feld verwenden, mit den Kosten für die Pflege
‫dieses Index und auch mit dem Lese-Schreib-Muster der Ressource abwägen.
‫Doch genau wie bei der Datenmodellierung gibt es
‫hier keine wirklich harten Regeln.
‫Es ist also alles ein
‫bisschen unscharf und man braucht wirklich einige
‫Experimente und auch Erfahrung, um es richtig zu machen, in Ordnung.
‫Aber was auch immer Sie tun, ignorieren Sie bitte nicht die Indizierung.
‫Denn auch wenn es nicht
‫perfekt ist, hat es immer einen großen Nutzen für Ihre Anwendung.
‫In Ordnung, und das ist eigentlich alles, was ich
‫Ihnen über Indizes zu sagen hatte.
‫Es gibt nur noch einen Index, den ich hier eigentlich einstellen
‫möchte, der für die Tour-Schnecke in Ordnung ist.
‫Denn später werden wir eigentlich
‫die Unique Slug verwenden wollen, um nach Touren abzufragen.
‫Das bedeutet, dass die Schnecke dann wahrscheinlich das
‫am meisten abgefragte Feld wird.
‫Es macht also
‫Sinn, auch dafür einen Index zu haben.
‫Also Tourschema. Index
‫und Schnecke eins.
‫Und meistens ist das Eins oder das Minus nicht so wichtig.
‫Okay, jetzt bin ich wirklich neugierig, dies
‫hier in Compass zu sehen.
‫Ich werde also versuchen, hier erneut eine Verbindung
‫zur Datenbank herzustellen.
‫Und so kann ich das hier nur aus den neuesten herausholen.
‫Klicken Sie auf, verbinden Sie sich, und dann sollten wir
‫mit derselben Datenbank verbunden werden.
‫Also Natours, Tours, kommen wir zu unseren Verzeichnissen.
‫Und jetzt geht es los.
‫Jetzt haben wir also unsere Indizes genau hier.
‫Vergrößern wir dieses Fenster und
‫schauen wir uns an, was wir bekommen haben.
‫Wir haben also unsere Schnecke hier.
‫Wir haben den Preis, den wir zuerst festlegen.
‫Und dann haben wir auch den Preis- und Bewertungsdurchschnitt,
‫der zusammengesetzt ist, und Sie sehen hier auch,
‫dass dieser hier aufsteigend ist und dieser absteigend,
‫weil er das Minus hat.
‫Und was Ihnen vielleicht auffällt, ist,
‫dass wir
‫diesen Preisindex tatsächlich nicht mehr in unserem Code haben.
‫Aber es ist noch da.
‫Es reicht also nicht aus, den Index aus
‫unserem Code zu entfernen, wir müssen ihn wirklich aus der Datenbank selbst löschen.
‫Denken Sie also daran, dass wir ihn am
‫Anfang hier hatten und
‫dann auskommentiert und diesen neuen zusammengesetzten Index erstellt
‫haben, aber auch hier steht der Index still.
‫Aber da wir es
‫eigentlich nicht mehr brauchen, können wir es einfach löschen.
‫Jetzt müssen wir den Namen nur noch eingeben, um
‫sicherzustellen, dass wir keine Fehler machen.
‫Also los geht's, großartig.
‫Das ist also die Macht der Indizes.
‫Sie können unsere Leseleistung in
‫Datenbanken wirklich viel, viel besser machen.
‫In Ihren eigenen
‫Anwendungen sollten Sie diese also niemals ignorieren.
‫Und bevor wir fertig sind, nehmen wir noch
‫die EXPLAIN-Methode zurück, die wir
‫hier in unserer Handler-Funktion hinzugefügt haben.
‫Und eigentlich nur
‫als Referenz, ich werde es hier so belassen.
‫Sparen Sie.
‫Zurück im Post-Menü.
‫Versuchen wir das jetzt.
‫Und tatsächlich, es funktioniert wieder.
‫Okay und jetzt ist es wirklich so.