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

Aufbau des großen MongoDB-Index sehr langsam

Missverständnisse

Geschwindigkeit

Auch wenn Sie nicht von einem Multi-Key-Index sprechen, passiert Folgendes. Es findet ein massiver Tabellenscan statt. MongoDB iteriert also über die Dokumente, versucht, das zu indexierende Feld zu finden, wertet dieses Feld aus (zu null wenn es im aktuellen Dokument nicht vorhanden ist) und schreibt seine Ergebnisse in nicht weniger als 6 Dateien, da wir von 6 Indizes sprechen. Nachrechnen:200.000.000 / 86400 * 5 sagt uns, dass MongoDB dies für ungefähr 460 Dokumente pro Sekunde tut oder benötigt nur 2,2 Millisekunden pro Dokument . Langsam würde ich das nicht nennen. Es kann lange dauern, aber es ist nicht langsam.

{background:true}

Die Verwendung dieses Parameters funktioniert nicht Sie aus den Datenbanken aussperren. Ganz im Gegenteil, was in den Dokumenten deutlich angegeben ist, sowohl auf dem Abschnitt Indexerstellung und im Tutorial-Abschnitt zum Erstellen von Indizes im Hintergrund . Es gibt jedoch einen Satz, der leicht missinterpretiert werden kann:

Das bedeutet, dass Sie keine Operationen ausführen können, die für alle Datenbanken und gelten erfordern eine Lese- oder Schreibsperre.

Möglichkeiten zur Verbesserung (in der Zukunft)

Sharded-Cluster

Verwenden Sie einen gemeinsam genutzten Cluster mit Replikatsatz-Shards. Es ist einfach einzurichten und hat neben der verbesserten Leistung mehrere Vorteile. Eine davon ist die einfache Skalierbarkeit. Das Hinzufügen eines Shards (und damit das Hinzufügen von Speicherplatz und Rechenleistung zu einem Cluster) ist sehr einfach. Backups wirken sich weniger auf die Anwendung aus. Es gibt keinen Single Point of Failure mehr (wenn es richtig gemacht wird, gilt dies sogar für Ausfälle in der Größenordnung eines ganzen Rechenzentrums).

Verwenden Sie ein anderes Dateisystem

Entschuldigung, das Ausführen einer leistungsabhängigen Anwendung von Disk IO auf einem Windows-Server macht für mich überhaupt keinen Sinn. ExtFS4 oder XFS sind je nach Optimierung zwischen 25 % und 40 % schneller als NTFS oder ReFS. Das macht eine echte Unterschied zu Anwendungen, die wie Ihr Anwendungsfall von Festplatten-IO abhängig sind. Wir reden hier von wenigen Tagen (nicht einmal unter Berücksichtigung der effizienteren Speicherzuordnung und des geringeren Speicherverbrauchs des Betriebssystems auf Linux-Systemen).

{background:true}

Obwohl dies die Leistung nicht wirklich verbessert (das Erstellen von Indizes im Hintergrund dauert aus offensichtlichen Gründen länger als im Vordergrund), bleibt Ihre Anwendung während der Zeit verfügbar, in der der Index erstellt wird. Abhängig von Ihren Anforderungen kann dies also eine praktikable Option sein.

Nebenbemerkung :Es ist eine Bad Idea™ , um bei Verwendung von mongoDB vertikal zu skalieren, da es explizit für die horizontale Skalierung konzipiert wurde. Dies gilt insbesondere für große Sammlungen wie Ihre, da die Parallelverarbeitung die Leistung Ihrer Anwendung erheblich verbessern würde.