2012-08-22 63 views
3

問題: 我有一個非常大的集合由場ts索引:(時間戳)MongoDB:爲什麼不按多個鍵使用索引進行排序?

> db.events.ensureIndex({'ts': -1}) 

我想最後5項。令我驚訝的是,查詢不使用索引,因此是非常緩慢:

> db.events.find().sort({'ts': -1, '_id': -1}).limit(5) 

然而,僅僅通過ts或其他字段排序使用索引,因爲它應該:

> db.events.find().sort({'ts': -1}).limit(5) 
> db.events.find().sort({'_id': -1}).limit(5) 

是這是MongoDB中的一個錯誤,這確實是一個記錄的功能,或者我做錯了什麼?

附加信息:

> db.events.find().sort({'ts': -1, '_id': -1}).limit(5).explain() 
{ 
    "cursor" : "BasicCursor", 
    "nscanned" : 795609, 
    "nscannedObjects" : 795609, 
    "n" : 5, 
    "scanAndOrder" : true, 
    "millis" : 22866, 
    "nYields" : 73, 
    "nChunkSkips" : 0, 
    "isMultiKey" : false, 
    "indexOnly" : false, 
    "indexBounds" : { 

    } 
} 
> db.events.find().sort({'ts': -1}).limit(5).explain() 
{ 
    "cursor" : "BtreeCursor ts_-1", 
    "nscanned" : 5, 
    "nscannedObjects" : 5, 
    "n" : 5, 
    "millis" : 0, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "isMultiKey" : false, 
    "indexOnly" : false, 
    "indexBounds" : { 
      "ts" : [ 
        [ 
          { 
            "$maxElement" : 1 
          }, 
          { 
            "$minElement" : 1 
          } 
        ] 
      ] 
    } 
} 

回答

5

這是值得擁有的索引建議& FAQ wiki頁面的Indexing Strategies部分的讀取。

還有,你可能會丟失一些注意事項:

  • MongoDB中僅使用每個查詢一個索引

  • 使用必須在指數

最後一列 sort

因此,對於您的示例,您應該在ts_id上添加複合索引:

db.events.ensureIndex({'ts': - 1,'_id': - 1});

..與explain()確認排序現在使用的預期指標:

> db.events.find().sort({'ts': -1, '_id':-1}).limit(5).explain() 
{ 
    "cursor" : "BtreeCursor ts_-1__id_-1", 
    "nscanned" : 5, 
    "nscannedObjects" : 5, 
    "n" : 5, 
    "millis" : 0, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "isMultiKey" : false, 
    "indexOnly" : false, 
    "indexBounds" : { 
     "ts" : [ 
      [ 
       { 
        "$maxElement" : 1 
       }, 
       { 
        "$minElement" : 1 
       } 
      ] 
     ], 
     "_id" : [ 
      [ 
       { 
        "$maxElement" : 1 
       }, 
       { 
        "$minElement" : 1 
       } 
      ] 
     ] 
    } 
} 
+0

這確實是答案 - 我猜關係的DB已經把我寵壞了... :)謝謝! – johndodo

+0

爲什麼排序列必須是索引中的最後一列? –

相關問題