Warum und Wann ist notwendig, um erstellen von Indizes in MongoDB?
Arbeiten mit MongoDB für eine Weile und heute hatte ich Zweifel, während der Diskussion mit einem Kollegen.
Die Sache ist, dass, wenn Sie einen index erstellen, der in MongoDB, ist die Sammlung Verarbeitung und der index wird erstellt.
Der index aktualisiert wird innerhalb einfügen und löschen von Dokumenten, so dass ich nicht wirklich die Notwendigkeit zu sehen, führen Sie einen index neu erstellen-Vorgang (das löscht den index und erstellen Sie ihn).
Nach MongoDB-Dokumentation:
Normalerweise, MongoDB komprimiert Indizes während des routine-updates. Für die meisten
Benutzer, die reIndex-Befehl ist überflüssig. Allerdings kann es Wert sein
ausgeführt, wenn die Sammlung Größe wesentlich geändert hat oder wenn die
Indizes verbrauchen unverhältnismäßig viel Speicherplatz.
Kann jemand, der hat die Notwendigkeit der Ausführung einer index neu erstellen-Vorgang, der es Wert?
- Ich benutze es, wenn ich Sie neu hinzufügen index.
- Aber wenn Sie fügen Sie einen neuen index ist es gebaut, dann rechts, die Sie nicht brauchen, um reindex
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als pro die MongoDB-Dokumentation, es ist in der Regel keine Notwendigkeit, routinemäßig die Indizes neu erstellen.
HINWEIS: Jede Beratung über die Lagerung wird interessanter mit MongoDB 3.0+, die Einführung einer pluggable storage engine API. Meine Kommentare unten sind insbesondere in Bezug auf die Standard-MMAP storage engine in MongoDB 3.0 und früher. WiredTiger-und anderen Speicher-engines haben unterschiedliche storage-Implementierungen für Daten - & Indizes.
Möglicherweise gibt es einige nutzen, die in einen index neu erstellen, mit der MMAP storage engine, wenn:
Einen index, verbraucht eine größere als die erwartete Menge an Platz im Vergleich zu den Daten. Hinweis: Sie müssen den monitor historischen Daten & index Größe, um eine Grundlinie für Vergleich.
Die Sie migrieren möchten, aus einer älteren index-format auf eine neuere. Wenn eine Neuindizierung wird empfohlen dies erwähnt werden die upgrade-Hinweise. Zum Beispiel, MongoDB 2.0 erhebliche index-performance-Verbesserungen so die release notes enthalten eine vorgeschlagene reindex auf die v2.0 format nach dem Upgrade. Ähnlich, MongoDB 2.6 eingeführt
2dsphere
(v2.0) - Indizes, die verschiedene Standard-Verhalten (sparse-Standard). Vorhandene Indizes werden nicht wieder aufgebaut nach dem index versions-upgrades; die Wahl wenn Sie für das upgrade Links zu den Datenbank-administrator.Geändert haben
_id
format für eine Sammlung oder eine monoton wachsende-Taste (zB. ObjectID) auf einen zufälligen Wert. Das ist ein bisschen esoterisch, aber es gibt eine index-Optimierung, teilt b-Baum Eimer 90/10 (statt 50/50) wenn Sie das einfügen_id
s, die sind immer (ref: SERVER-983). Wenn die Natur Ihre_id
s stark ändert, kann es möglich sein, um eine effiziente b-Baum mit einem re-index.Weitere Informationen zur Allgemeinen B-Struktur-Verhalten finden Sie unter: Wikipedia: B-Baum
Visualisierung index-usage
Wenn Sie wirklich neugierig zu Graben, in die index-Interna ein bisschen mehr, es gibt einige experimentelle Befehle/tools, die Sie ausprobieren können. Ich erwarte, dass diese beschränkt sind, MongoDB 2.4 & 2.6 nur:
indexStats
- BefehlSpeicher-viz
- WerkzeugWährend ich don T wissen, die genaue technische Gründe, warum es in MongoDB, ich kann machen einige Annahmen über diese, basierend auf dem, was ich weiß, über die Indizierung von anderen Systemen, und auf der Grundlage der Dokumentation, die Sie zitiert.
Die Allgemeine Idee Eines Index
Wenn Sie sich von einem Dokument zum nächsten, in der das komplette Dokument-Sammlung, es gibt eine Menge vergeudete Zeit und Mühe, das überspringen Vergangenheit alle Daten, die nicht behandelt werden müssen. Wenn Sie auf der Suche zum Dokument mit der id "1234", zu bewegen über 100K von jedem Dokument, macht es langsam
Anstatt auf die Suche durch alle Inhalte der einzelnen Dokumente in der Sammlung (körperlich bewegen die Leseköpfe der Festplatte, etc), ein index macht diese schnell. Es ist im Grunde ein Schlüssel/Wert-paar, die Ihnen die id und den Speicherort des Dokuments. MongoDB kann schnell durchgehen, alle id ' s im index finden Sie die Speicherorte der Dokumente, die Sie braucht und gehen, laden Sie Sie direkt.
Zuteilung Der Datei-Größe Für Einen Index
Indizes Speicherplatz belegen, denn im Grunde sind Sie ein Schlüssel/Wert-paar gespeichert in einem viel kleineren Ort. Wenn Sie eine sehr große Sammlung (große Anzahl von Elementen in der Sammlung) dann ist dein index wächst in der Größe.
Den meisten Betriebssystemen reservieren von Blöcken auf der Festplatte in bestimmten Blockgrößen. Die meisten Datenbank-auch die Zuordnung von Speicherplatz in großen Stücken, wie gebraucht.
Statt zu wachsen 100K Dateigröße, wenn 100K von Dokumenten Hinzugefügt werden, MongoDB voraussichtlich 1MB oder vielleicht 10MB oder so etwas - ich weiß nicht, was das tatsächliche Wachstum Größe ist. In SQL Server können Sie sagen, wie schnell zu wachsen, und MongoDB, hat vermutlich so etwas wie, dass.
Wächst in Blöcken geben die Möglichkeit zu "wachsen" die Dokumente in den Raum schneller, weil die Datenbank nicht brauchen, um ständig zu erweitern. Wenn die Datenbank hat nun 10MB Platz bereits zugewiesen wurde, kann er einfach einen Raum aus. Sie nicht haben, um halten Sie die Erweiterung der Datei für jedes Dokument. Es muss nur zum schreiben der Daten in die Datei.
Dies ist wahrscheinlich wahr, der Sammlungen und der Indizes für die Sammlungen - alles, was auf der Festplatte gespeichert ist.
Größe Der Datei-Und Index-Re-Gebäude
Wenn Sie eine große Sammlung hat eine Menge von Dokumenten Hinzugefügt und entfernt, der index stark fragmentiert wird. index-Schlüssel kann nicht in Ordnung sein, weil es Platz in der Mitte der index-Datei und nicht am Ende, wenn der index benötigt, um gebaut werden. Index-Schlüssel kann eine Menge Raum zwischen Ihnen, wie gut.
Wenn es 10.000 Artikel im index und # 10,001 muss eingefügt werden, es kann sein eingefügt in der Mitte der index-Datei. Jetzt wird der index benötigt, um wieder aufzubauen, sich selbst um alles wieder in Ordnung. Dies umfasst das verschieben von vielen Daten um, um Platz zu machen, an das Ende der Datei und setzen Element # 10,001 am Ende.
Wenn sich der index wird ständig geprügelt - viele Sachen entfernt und Hinzugefügt werden - es ist wahrscheinlich schneller wachsen nur die index-Datei, Größe und bringe immer Sachen am Ende. dies ist schnell um den index zu erstellen, lässt aber die leeren Löcher in der Datei, wo alte Sachen gelöscht wurden.
Wenn die index-Datei hat leere Raum, in dem gelöschte Dinge verwendet werden, dies ist vergebliche Mühe beim Lesen des index. Die index-Datei hat mehr Bewegung als nötig, um an den nächsten Eintrag in den index. Also der index, der sich selbst repariert... was zeitaufwändig sein kann für sehr große Sammlungen oder sehr große änderungen an einer Kollektion.
Rebuild Für Einen Großen Index-Datei
Es kann eine Menge von disk-Zugriff und I/O-Operationen korrekt kompakt die index-Datei wieder auf eine vernünftige Größe, mit der alles in Ordnung ist. Bewegen sich Gegenstände zu temp Lage, kostenloser Speicherplatz in der richtigen Stelle, verschieben Sie Sie zurück. Ach übrigens, um Speicherplatz freizugeben, die Sie sich bewegen mussten, um andere Gegenstände zu temp Lage. Es ist rekursiv und heavy-handed.
Deshalb, wenn Sie haben eine sehr große Anzahl von Elementen in einer Sammlung, und diese Sammlung hat Elemente Hinzugefügt und entfernt werden, auf einer regelmäßigen basis, wird der index möglicherweise müssen Sie von Grund auf neu aufgebaut. Dies würde wischen Sie die aktuelle index-Datei und neu erstellen von Grund auf - und das ist wahrscheinlich schneller, als zu versuchen zu tun, Tausende von Zügen innerhalb der bestehenden Datei. Anstatt sich um Sachen, die es gerade schreibt Sie Sie der Reihe nach, von Grund auf.
Große Veränderung In Der Collection Größe
Alles geben, ich nehme über, eine große Veränderung in der collection Größe würde dazu führen, diese Art von Prügel. Wenn Sie über 10.000 Dokumente in der Sammlung und Sie löschen 8.000... naja, jetzt haben Sie einen leeren Platz in deiner index-Datei, wo die 8.000 Artikeln verwendet werden. MongoDB bewegen muss, die restlichen 2.000 Stück um in der physischen Datei, um es wieder aufzubauen in einer kompakten form.
Anstatt zu warten, um für 8.000 leere Räume gereinigt werden, es könnte schneller wieder aufzubauen, von Grund auf mit den verbleibenden 2.000 Elemente.
Schlussfolgerung? Vielleicht?
So, in der Dokumentation, die Sie genannt haben, ist wahrscheinlich, Umgang mit "big data" braucht oder hohe Prügel Sammlungen und Indizes.
Beachten Sie auch, dass ich eine Vermutung basierend auf dem, was ich darüber weiß, Indizierung, Datenträger-Zuordnung, Datei-Fragmentierung usw.
Meine Vermutung ist, dass "die meisten Nutzer" in der Dokumentation bedeutet, dass es zu 99,9% oder mehr von mongodb collections brauchen Sie nicht zu kümmern.
MongoDB konkreten Fall
Nach MongoDB-Dokumentation:
Also, wenn Sie löschen von Dokumenten aus einer Kollektion, die Sie verschwenden Speicherplatz, es sei denn, Sie erstellen Sie den index neu für diese Sammlung.
remove()
Befehl geht: es bedeutet nicht, entfernen Sie den index-Definitionen (aber die index-Einträge sind in der Tat entfernt).