2012-09-18 12 views
11

Ich speichere Buch Metadaten wie Name, Autoren, Preis, Verlag, etc. in einem Mongodb-Dokument. Ich habe ungefähr 10 Millionen dieser Dokumente und sie alle sind in einer Sammlung. Die durchschnittliche Dokumentgröße beträgt 1,9 KB. Jetzt habe ich Indizes auf name, authors und price. In der Tat Ich habe 2 Indizes auf Preis eins in aufsteigender Reihenfolge und einer absteigenden Reihenfolge. Meine mongodb-Version ist 2.2.0 und ich benutze den php-Treiber, um mongo abzufragen. Die Treiberversion ist 1.12. Aber wenn ich eine Bereichsabfrage zum Preis mache, bekomme ich eine MongoCursorTimeoutException. In meiner Anfrage versuche ich Bücher in einer bestimmten Preisklasse wie "Preis unter 1000 und mehr als 500" zu finden.Abfrage auf 10 Millionen Mongodb-Dokumente

Das Timeout zu erhöhen scheint keine gute Idee zu sein (es ist bereits 30 Sekunden). Gibt es noch etwas, was ich tun kann, um den Abfrageprozess zu beschleunigen?

BEARBEITEN Eigentlich ist mein Preisindex zusammengesetzt. Ich habe ein Statusfeld, das einen ganzzahligen Wert hat, so dass mein Preisindex wie {price:-1,status:1} und {price:1,status:1} aussieht Ich versuche auch, 20 Dokumente gleichzeitig mit PHP abzurufen.

+0

memcached? das sind 18 Gigs, kein Wunder. Wie viel Speicher hast du installiert? – nullpotent

+0

@iccthedral Ich habe 8 GB RAM. Aber meine Gesamtindexgröße beträgt ca. 6 GB. So habe ich genug Speicher, um meine Indizes im RAM zu halten – lovesh

+3

Mit separaten aufsteigenden und absteigenden Indizes auf Preis ist eine Verschwendung. Richtung [spielt keine Rolle] (http://www.mongodb.org/display/DOCS/Indexes#Indexes-CompoundKeys) für Einzelfeldindizes. Entfernen Sie eine von ihnen, um etwas Index-RAM freizugeben. – JohnnyHK

Antwort

0

Als @JohnyHK sagte mein RAM war zu niedrig. Also auf 12 GB erhöht und es funktioniert jetzt. Danke an alle für ihre Kommentare und Antworten

1
  1. Überprüfen Sie Ihre Angaben. Reindizieren Sie Ihre Daten erneut und stellen Sie sicher, dass die Auflistung vollständig indiziert ist, bevor Sie die Abfragen ausführen. (10 mi. Dokumente können eine Weile dauern, um zu indizieren)
  2. Der langsamste Teil jeder indizierten Abfrage ist der tatsächliche Dokumentabruf. Ich könnte mir vorstellen, dass je nach der Anzahl der Dokumente, die du ziehst, 30 Sekunden oder mehr und viel Speicher benötigt werden.

Weitere nützliche Hinweise auf einige Dinge, die Sie diese Seite überprüfen könnten versuchen: http://www.mongodb.org/display/DOCS/Optimization

Für 10 mi. Dokumente könnten Sie auch darüber nachdenken, die Daten über Computer hinweg zu teilen. Beachten Sie, dass Festplattenlesevorgänge langsamer als CPU-Zyklen sind.

+0

Ich versuche, 20 Dokumente auf einmal zu finden, so "Limit" ist 20 – lovesh

+0

Das ist gut, so dass Vorschlag nicht zutrifft. – andychase

5

Wir haben viel Erfahrung mit Mongo-Sammlungen mit Millionen von Dokumenten, die sowohl Single-/Shared-Server als auch dedizierte Replica-Sets auf EC2 verwenden, die sowohl herkömmliche als auch SSD-EBS-Volumes verwenden. Die Workloads sind unterschiedlich: Einige sind analytikorientiert, andere unterstützen Webanforderungen. Hier ist die Ursachenanalyse Weg, den ich empfehlen würde:

  1. Führen Sie Ihre Abfragen mit .explain() zu sehen, was in Bezug auf die Indizes vor sich geht, etc. verwendet anpassen Indizes, falls erforderlich. Mongos Optimierer ist ziemlich naiv. Wenn Ihre Indizes nicht perfekt mit dem Abfragemuster übereinstimmen, werden sie möglicherweise übersehen.

  2. Überprüfen Sie MMS und suchen Sie nach einem der folgenden Probleme: (1) nicht alle Daten im Speicher (angezeigt durch Seitenfehler) und (2) Warteschlangenlängen (in der Regel eine Art von Flaschenhals). Die Leistung von Mongo verschlechtert sich schnell, wenn nicht alle Daten im Speicher sind, da die Datenbank eine einzige globale Sperre hat und der Speicher, insbesondere in der Cloud, schlechte Nachrichten sind. Wir haben kürzlich auf den SSD-Cloud-Speicher aufgerüstet und sehen eine 3-10-fache Verbesserung der Leistung in einer Datenbank, die etwa 1/2 TB groß ist.

  3. Erhöhen Sie den Profilierungslevel auf 2 (den Maximalwert), laufen Sie eine Weile und sehen Sie sich das Betriebsprotokoll an. Siehe die MongoDB profiler.

Hoffe, das hilft.

Verwandte Themen