2013-03-15 73 views
2

我試圖找出是否按降序排列_id字段利用系統自動創建的索引。我試圖用explain()來解決它,但我不確定。我應該在_id上創建一個額外的索引以降低數據返回速度?Mongo按降序排列_id是否利用自動索引或?

 
> db.foo.insert({ name: 'foo' }); 
> db.foo.insert({ name: 'bar' }); 
> db.foo.find(); 
{ "_id" : ObjectId("5142d30ca4a8b347cb678c1a"), "name" : "foo" } 
{ "_id" : ObjectId("5142d310a4a8b347cb678c1b"), "name" : "bar" } 
> db.foo.find().sort({ _id: -1 }); 
{ "_id" : ObjectId("5142d310a4a8b347cb678c1b"), "name" : "bar" } 
{ "_id" : ObjectId("5142d30ca4a8b347cb678c1a"), "name" : "foo" } 
> db.foo.find().sort({ _id: -1 }).explain(); 
{ 
    "cursor" : "BtreeCursor _id_ reverse", 
    "isMultiKey" : false, 
    "n" : 2, 
    "nscannedObjects" : 2, 
    "nscanned" : 2, 
    "nscannedObjectsAllPlans" : 2, 
    "nscannedAllPlans" : 2, 
    "scanAndOrder" : false, 
    "indexOnly" : false, 
    "nYields" : 0, 
    "nChunkSkips" : 0, 
    "millis" : 0, 
    "indexBounds" : { 
     "_id" : [ 
      [ 
       { 
        "$maxElement" : 1 
       }, 
       { 
        "$minElement" : 1 
       } 
      ] 
     ] 
    }, 
    "server" : "localhost:27017" 
} 

回答

5

的解釋的確給了一個很好的指標,因爲它是能夠使用的,因爲財產cursor下的第一行的反向默認_id指數:BtreeCursor _id_ reverse

BtreeCursor顯示它是使用索引的遊標,而_id_ reverse顯示它正在使用相反的_id_索引。

從所有意圖和目的來看,它應該正確使用_id索引。作爲額外的,MongoDB還沒有索引相交(https://jira.mongodb.org/browse/SERVER-3071),這意味着它仍然使用(對於大多數查詢)條件和排序的單個索引,所以如果你想使用查找條件會發現你可能需要在未來的索引中包含_id

+0

太好了。現在,如果我向名稱字段添加索引並按_id按降序排序,它是否會利用_id上的索引或是否需要使用{name:1,_id:-1}創建新索引? – Glitches 2013-03-15 19:00:22

+0

@Glitches目前您需要製作複合索引 – Sammaye 2013-03-15 21:35:37