2014-01-05 30 views
0

考慮下面的查詢,這是一個相當簡單的用例:

db.Transactions.find({ 
    $or: [ 
     { "from.addresses" : "[email protected]" }, 
     { "to.addresses" : "[email protected]" } 
    ] 
}).sort({ "time" : -1 }); 

「from.addresses」和「to.addresses」被索引字段(陣列)。這些指數不是複合的。目前沒有「時間」索引。 請注意,我在此集合上使用分片,這可能會影響查詢的行爲。

的問題是:

  • 如果我選上「時間」(進行分頁正確的交易給用戶),沒有索引的使用和整個集合進行掃描(數以千萬計的文件):.explain()=>「cursor」:「BasicCursor」
  • 如果我刪除.sort(),那麼索引正確使用
  • 如果我刪除$或者,那麼索引是正確使用

是否有可能讓MongoDB使用索引? 我目前正在考慮運行2個單獨的查詢(每個$或$),並自己合併(比$或行爲快得多)。

請找到完整的.explain低於()(上比實際更小的收集運行,在實際運行一個將採取小時):

{ 
     "clusteredType" : "ParallelSort", 
     "shards" : { 
       "rs/mongo-a:27017,mongo-b:27017" : [ 
         { 
           "cursor" : "BasicCursor", 
           "isMultiKey" : false, 
           "n" : 1356, 
           "nscannedObjects" : 45589, 
           "nscanned" : 45589, 
           "nscannedObjectsAllPlans" : 45589, 
           "nscannedAllPlans" : 45589, 
           "scanAndOrder" : true, 
           "indexOnly" : false, 
           "nYields" : 356, 
           "nChunkSkips" : 8014, 
           "millis" : 44726, 
           "indexBounds" : { 

           }, 
           "server" : "mongo-a:27017" 
         } 
       ], 
       "rs1/mongo-a1:27018,mongo-b1:27018" : [ 
         { 
           "cursor" : "BasicCursor", 
           "isMultiKey" : false, 
           "n" : 3435, 
           "nscannedObjects" : 15663, 
           "nscanned" : 15663, 
           "nscannedObjectsAllPlans" : 15663, 
           "nscannedAllPlans" : 15663, 
           "scanAndOrder" : true, 
           "indexOnly" : false, 
           "nYields" : 4, 
           "nChunkSkips" : 0, 
           "millis" : 505, 
           "indexBounds" : { 

           }, 
           "server" : "mongo-a1:27018" 
         } 
       ], 
       "rs2/mongo-a2:27018,mongo-b2:27018" : [ 
         { 
           "cursor" : "BasicCursor", 
           "isMultiKey" : false, 
           "n" : 2208, 
           "nscannedObjects" : 10489, 
           "nscanned" : 10489, 
           "nscannedObjectsAllPlans" : 10489, 
           "nscannedAllPlans" : 10489, 
           "scanAndOrder" : true, 
           "indexOnly" : false, 
           "nYields" : 2, 
           "nChunkSkips" : 0, 
           "millis" : 329, 
           "indexBounds" : { 

           }, 
           "server" : "mongo-a2:27018" 
         } 
       ], 
       "rs3/mongo-a3:27018,mongo-b3:27018" : [ 
         { 
           "cursor" : "BasicCursor", 
           "isMultiKey" : false, 
           "n" : 2249, 
           "nscannedObjects" : 10500, 
           "nscanned" : 10500, 
           "nscannedObjectsAllPlans" : 10500, 
           "nscannedAllPlans" : 10500, 
           "scanAndOrder" : true, 
           "indexOnly" : false, 
           "nYields" : 7, 
           "nChunkSkips" : 0, 
           "millis" : 439, 
           "indexBounds" : { 

           }, 
           "server" : "mongo-a3:27018" 
         } 
       ], 
       "rs4/mongo-a4:27018,mongo-b4:27018" : [ 
         { 
           "cursor" : "BasicCursor", 
           "isMultiKey" : false, 
           "n" : 2251, 
           "nscannedObjects" : 10488, 
           "nscanned" : 10488, 
           "nscannedObjectsAllPlans" : 10488, 
           "nscannedAllPlans" : 10488, 
           "scanAndOrder" : true, 
           "indexOnly" : false, 
           "nYields" : 4, 
           "nChunkSkips" : 0, 
           "millis" : 336, 
           "indexBounds" : { 

           }, 
           "server" : "mongo-a4:27018" 
         } 
       ], 
       "rs5/mongo-a5:27018,mongo-b5:27018" : [ 
         { 
           "cursor" : "BasicCursor", 
           "isMultiKey" : false, 
           "n" : 1175, 
           "nscannedObjects" : 5220, 
           "nscanned" : 5220, 
           "nscannedObjectsAllPlans" : 5220, 
           "nscannedAllPlans" : 5220, 
           "scanAndOrder" : true, 
           "indexOnly" : false, 
           "nYields" : 2, 
           "nChunkSkips" : 0, 
           "millis" : 376, 
           "indexBounds" : { 

           }, 
           "server" : "mongo-a5:27018" 
         } 
       ] 
     }, 
     "cursor" : "BasicCursor", 
     "n" : 12674, 
     "nChunkSkips" : 8014, 
     "nYields" : 375, 
     "nscanned" : 97949, 
     "nscannedAllPlans" : 97949, 
     "nscannedObjects" : 97949, 
     "nscannedObjectsAllPlans" : 97949, 
     "millisShardTotal" : 46711, 
     "millisShardAvg" : 7785, 
     "numQueries" : 6, 
     "numShards" : 6, 
     "millis" : 44939 
} 
+0

什麼是這個集合的分片鍵,什麼是「正確」的索引使用? – Stennie

回答

2

有一個JIRA你可能想要觀看:https://jira.mongodb.org/browse/SERVER-1205

+0

似乎是完全問題。 2010年開業,至今仍未解決。該死的,這麼多問題,我覺得非常有限! – Vincent

+0

@Vincent事實上,這是一個非常嚴重的問題,但它應該很快就會被解決 – Sammaye

+0

@Vincent有人說你可以在同時提示它,它只是優化器沒有看到它 – Sammaye