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

MongoDB Interne Implementierung der Indizierung?

Ich denke, Sie haben eine Idee, dass Indizes im RAM gespeichert werden. Was ist, wenn ich sage, dass sie es nicht sind?

Zunächst müssen wir verstehen, was Indizes sind. Indizes sind im Grunde ein Zeiger, der angibt, wo sich dieses Dokument auf der Festplatte befindet. Genau wie bei der Indizierung im Buch können wir für einen schnelleren Zugriff sehen, welches Thema sich auf welcher Seitenzahl befindet.

Wenn also Indizes erstellt werden, werden sie auch auf der Festplatte gespeichert. Wenn jedoch eine Anwendung ausgeführt wird, werden sie aufgrund der häufigen Verwendung und des noch schnelleren Zugriffs in den Arbeitsspeicher geladen, aber es gibt einen Unterschied zwischen geladen und erstellt.

Auch das Laden eines Index ist nicht dasselbe wie das Laden einer Sammlung oder von Datensätzen in den Arbeitsspeicher. Wenn wir einen Index geladen haben, wissen wir, welche Dokumente von der Festplatte aufgenommen werden müssen, im Gegensatz zum Laden aller Dokumente und Verifizieren jedes einzelnen von ihnen. Indizes vermeiden also Sammlungsscans.

Die Erstellung von Indizes ist ein einmaliger Vorgang, aber jeder Schreibvorgang in das Dokument kann möglicherweise die Indizierung ändern, sodass ein Teil möglicherweise neu berechnet werden muss, da Datensätze basierend auf der Änderung der Daten gemischt werden können. deshalb macht die Indizierung das Schreiben langsam und das Lesen schnell.

Stellen Sie sich das wieder als Buch vor, wenn Sie ein neues Thema von beispielsweise 2 Seiten zwischen dem Buch hinzufügen, müssen alle Indizes nach dieser Themennummer neu berechnet werden. entsprechend.

  • Nein, Datensätze werden nicht im RAM gespeichert, während die Erstellung alle Dokumente in der Sammlung verarbeitet und ein Indexblatt erstellt, wäre dies verständlicherweise zeitaufwändig, wenn es zu viele Dokumente gibt, deshalb gibt es das eine Option, um einen Index im Hintergrund zu erstellen.
  • Index wird einmal erstellt, Sie können ihn löschen und erneut erstellen, aber er wird bei der Anwendung oder dem DB-Neustart nicht neu erstellt. das wäre verrückt für eine riesige Sammlung in einer Sharding-Umgebung.
  • Auch das ist nicht wahr. _id kommt als indiziertes Feld, sodass der Index bereits für eine leere Sammlung erstellt wurde, da beim Schreiben der Index neu berechnet würde. Da es sich um einen eindeutigen Index handelt, wäre die Verarbeitung schneller.
  • Alle Datensätze würden nur im RAM gespeichert, wenn Sie die In-Memory-Engine von MongoDB verwenden, die meiner Meinung nach als Enterprise Edition erhältlich ist. Aufgrund der Indizierung würde es den Datensatz nicht automatisch in den Arbeitsspeicher laden.