2015-04-20 54 views
2

我使用的是mongo db 2.6.9。 我在一個集合上創建了2個索引,我不理解查詢平面總是選擇錯誤的索引。Mongo選擇了錯誤的索引

我想了解我錯過了什麼。

第一個索引:

{ 
    "TimeStamp":1, 
    "A":1, 
    "B":1, 
} 

第二個索引:

{ 
    "TimeStamp":1, 
    "A":1, 
    "C":1, 
} 

當我期運用下面的查詢計劃者選擇的第一個索引:

db.collection.find({"TimeStamp":{ "$gte" : ISODate("2015-04-14T00:00:00Z"), "$lt" : ISODate("2015-04-15T00:00:00Z") },"C":2137,"A":1}).explain() 

解釋({詳細:1})結果:

{ 
    "cursor" : "BtreeCursor IX_First", 
    "isMultiKey" : false, 
    "n" : 0, 
    "nscannedObjects" : 0, 
    "nscanned" : 0, 
    "nscannedObjectsAllPlans" : 0, 
    "nscannedAllPlans" : 0, 
    "scanAndOrder" : false, 
    "indexOnly" : false, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "millis" : 0, 
    "indexBounds" : { 
      "TimeStamp" : [ 
        [ 
          ISODate("2015-04-14T00:00:00Z"), 
          ISODate("2015-04-15T00:00:00Z") 
        ] 
      ], 
      "A" : [ 
        [ 
          1, 
          1 
        ] 
      ], 
      "B" : [ 
        [ 
          { 
            "$minElement" : 1 
          }, 
          { 
            "$maxElement" : 1 
          } 
        ] 
      ], 
    }, 
    "allPlans" : [ 
      { 
        "cursor" : "BtreeCursor IX_First", 
        "isMultiKey" : false, 
        "n" : 0, 
        "nscannedObjects" : 0, 
        "nscanned" : 0, 
        "scanAndOrder" : false, 
        "indexOnly" : false, 
        "nChunkSkips" : 0, 
        "indexBounds" : { 
      "TimeStamp" : [ 
        [ 
          ISODate("2015-04-14T00:00:00Z"), 
          ISODate("2015-04-15T00:00:00Z") 
        ] 
      ], 
      "A" : [ 
        [ 
          1, 
          1 
        ] 
      ], 
      "B" : [ 
        [ 
          { 
            "$minElement" : 1 
          }, 
          { 
            "$maxElement" : 1 
          } 
        ] 
      ], 
    }, 
      { 
        "cursor" : "BtreeCursor IIX_Second", 
        "isMultiKey" : false, 
        "n" : 0, 
        "nscannedObjects" : 0, 
        "nscanned" : 0, 
        "scanAndOrder" : false, 
        "indexOnly" : false, 
        "nChunkSkips" : 0, 
        "indexBounds" : { 
          "TimeStamp" : [ 
            [ 
              ISODate("2015-04-14T00:00:00Z"), 
              ISODate("2015-04-15T00:00:00Z") 
            ] 
          ], 
          "A" : [ 
            [ 
              1, 
              1 
            ] 
          ], 
          "C" : [ 
            [ 
              2137, 
              2137 
            ] 
          ] 
        } 
      } 
    ], 
    "server" : "mongo2:27017", 
    "filterSet" : false, 
    "stats" : { 
      "type" : "KEEP_MUTATIONS", 
      "works" : 2, 
      "yields" : 0, 
      "unyields" : 0, 
      "invalidates" : 0, 
      "advanced" : 0, 
      "needTime" : 0, 
      "needFetch" : 0, 
      "isEOF" : 1, 
      "children" : [ 
        { 
          "type" : "FETCH", 
          "works" : 1, 
          "yields" : 0, 
          "unyields" : 0, 
          "invalidates" : 0, 
          "advanced" : 0, 
          "needTime" : 0, 
          "needFetch" : 0, 
          "isEOF" : 1, 
          "alreadyHasObj" : 0, 
          "forcedFetches" : 0, 
          "matchTested" : 0, 
          "children" : [ 
            { 
              "type" : "IXSCAN", 
              "works" : 1, 
              "yields" : 0, 
              "unyields" : 0, 
              "invalidates" : 0, 
              "advanced" : 0, 
              "needTime" : 0, 
              "needFetch" : 0, 
              "isEOF" : 1, 
              "keyPattern" : "{ TimeStamp: 1, A: 1, B: 1}", 
              "isMultiKey" : 0, 
              "boundsVerbose" : "field #0['TimeStamp']: [new Date(1428969600000), new Date(1429056000000)), field #1['A']: [1.0, 1.0], field #2['B']: [MinKey, MaxKey]", 
              "yieldMovedCursor" : 0, 
              "dupsTested" : 0, 
              "dupsDropped" : 0, 
              "seenInvalidated" : 0, 
              "matchTested" : 0, 
              "keysExamined" : 0, 
              "children" : [ ] 
            } 
          ] 
        } 
      ] 
    } 

}

+1

也許你可以張貼的解釋...或更好,但('解釋({詳細:1})')的輸出;-) – Fox

+0

也許看看'提示()' ? –

+0

用解釋({verbose:1} –

回答

0

這是因爲索引字段的順序在這種情況下很重要。嘗試更換A和C:

db.collection.find({"TimeStamp":{ "$gte" : ISODate("2015-04-14T00:00:00Z"), "$lt" : ISODate("2015-04-15T00:00:00Z") },"A":1,"C":2137}).explain()