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

So beschleunigen Sie die Mongo-Abfrage

Ein paar Dinge, die Sie hier tun können:

Verwenden Sie zunächst ein $in anstelle eines $or.

Zweitens kann MongoDB nur Verwenden Sie für Ihre erste Übereinstimmung einen Index, sodass Sie (durch Ausprobieren) entscheiden müssen, welche der beiden Übereinstimmungen besser ist. Das Ziel ist eine möglichst schnelle Abfrage und möglichst wenige Dokumente, die Ihre Pipeline durchlaufen. Dazu tun Sie die folgenden Dinge:

Erstellen Sie zuerst die drei Indizes:

db.element.ensureIndex( { 'versions.branch' : 1 } );
db.element.ensureIndex( { 'doctype' : 1 } );
db.element.ensureIndex( { 'prefix' : 1 } );

Führen Sie dann die folgenden drei Abfragen aus und beachten Sie die Felder "cursor", "n", "nScanned" und "ms":

branch = "nameofbranch"; // guessing here
db.element.find( "versions.branch": branch ).explain();
db.element.find( "doctype" { $in: [ "15281", "15282" .... ] } ).explain();
db.element.find( "prefix": { $ne: "500" } ).explain();

Bei der letzten Abfrage werden Sie feststellen, dass "cursor" "BasicCursor" ist, da eine $ne-Abfrage den Index nicht verwenden kann.

Die anderen beiden zeigen Ihnen verschiedene Werte für "ms", "n" und "nScanned". "ms" ist die Zeit, die zum Ausführen der Abfrage benötigt wurde. Wenn dies ungefähr gleich ist, sehen Sie sich die Differenz zwischen den Werten "n" und "nScanned" an. Ich gehe davon aus, dass der Unterschied für die Abfrage "versions.branch" 0 ist. Für die Abfrage "doctype" könnte es anders sein. Wenn "ms" nicht ungefähr gleich ist, setzen Sie das $match ein, das am schnellsten war zuerst als $match-Klausel in Ihrer Aggregationspipeline.

Wenn die Geschwindigkeit ("ms") beide gleich ist, überprüfen Sie die "n"-Werte. Wenn das „n“ für die „Präfix“-Abfrage beispielsweise „5“ und das „n“ für die „versions.branch“-Abfrage „500“ ist, bedeutet dies, dass das Ergebnis der „Präfix“-Abfrage besser ist, da weniger Unterlagen zurückgegeben werden. Setzen Sie dies in diesem Fall als Ihre erste $match-Klausel insgesamt ein. Wenn die "versions.branch" viel kleiner ist, verwenden Sie diese als erste $match-Klausel.