2016-09-05 2 views
4

Ich verwende mongodb 2.6, und ich habe die folgende Abfrage:mongodb mit weniger performant Index

db.getCollection('Jobs').find(
{ $and: [ { RunID: { $regex: ".*_0" } }, 
      { $or: [ { JobType: "TypeX" }, 
        { JobType: "TypeY" }, 
        { JobType: "TypeZ" }, 
        { $and: [ { Info: { $regex: "Weekly.*" } }, { JobType: "YetAnotherType" } ] } ] } ] }) 

Ich habe drei verschiedene Indizes: RunID, RunID + JobType, RunID + JobType + Info. Mongo verwendet immer den Index, der nur RunID enthält, obwohl die anderen Indizes mit höherer Wahrscheinlichkeit schnellere Ergebnisse liefern, manchmal sogar einen Index, der aus RunID + StartTime besteht, während StartTime nicht einmal in der Liste der verwendeten Felder ist dieser Index?

Antwort

2

Hinweis 1:

Sie können Ihre ersten zwei Indizes, RunID und RunID + JobType fallen. Es genügt, nur den erweiterten Verbundindex RunID + JobType + Info zu verwenden; dies kann auch abfragen auf RunID oder RunID + JobType Felder verwendet werden, info here:

Neben Anfragen zu unterstützen, die auf allen Indexfeldern entsprechen, Verbindung Indizes Abfragen unterstützen können, die auf dem Präfix der Indexfelder entsprechen .

Wenn Sie diese Indizes löschen, wählt Mongo den einzigen verbleibenden Index.

Hinweis 2:

Sie immer hint verwenden können, zu sagen, Mongo einen bestimmten Index zu verwenden:

db.getCollection('Jobs').find().hint({RunID:1, JobType:1, Info:1}) 
+2

Beachten Sie, dass die Indexnutzung zwischen 2,6 und 3,2 in Bezug auf $ oder anders ist – Sammaye

1

Dank Sergiu's answer und Sammaye's comment, ich glaube, ich gefunden, was ich suche:

  1. Ich habe RunID Index loszuwerden, seit RunID ist ein Präfix in vielen anderen Indizes, mongodb wird es verwenden, wenn es nur RunID benötigt.

  2. $or betrifft, haben wir im Anschluss an die in der documentation:

Wenn die Klauseln in der $ oder Ausdruck Auswertung MongoDB entweder führt eine Sammlung Scan oder, wenn alle Klauseln unterstützt werden von Indizes, führt MongoDB Index-Scans durch. Das heißt, für MongoDB, Indizes zu verwenden, um ein $ oder einen Ausdruck auszuwerten, müssen alle Klauseln in dem $ oder Ausdruck von Indexen unterstützt werden. Andernfalls führt MongoDB einen Sammlungs-Scan durch.

Wie ich bereits erwähnt, ist RunID bereits indiziert, also brauchen wir einen neuen Index für die anderen Felder in der Abfrage: JobType und Info, da JobType Bedürfnisse der Index des Präfix sein, so dass es in Abfragen verwendet werden können, nicht Info Feld enthalten, so dass der zweite Index erstellt I ist

{ "JobType": 1.0, "Info": 1.0} 

Als Ergebnis mongodb einen komplexen Plan, in dem verschiedene Indizes werden verwendet, verwendet wird.

Verwandte Themen