Mongo查询使用C#驱动程序很慢,但快速使用mongo shell

时间:2016-03-13 11:12:01

标签: c# mongodb query-optimization database

我遇到了MongoDB C#驱动程序非常奇怪的问题。我有一个非常简单的查询,我有一个正确的索引索引。当我使用MongoChef(并使用shell)运行查询时,我在22ms内得到结果 但是当我的应用程序运行相同的查询时,返回答案大约需要2.5分钟(这不是由于网络问题)。

我已经检查了db.currentOp(),我发现op确实需要大约2.5分钟才能完成,查询与手动运行的查询相同,执行计划也使用索引。 任何的想法? 感谢

P.S 问题不在于结果集的大小!我测试的结果集有0个结果,21个结果和600,000个结果,所有这些结果都很可怕! (只有21个结果超过2米,在shell中没有时间!)

{
  "inprog": [
       {
         "opid" : 53214,
         "active" : true,
         "secs_running" : 174,
         "microsecs_running" : 174085497,
         "op" : query,
         "ns" : db.collection,
         "query" : {{$query : {ParentId: 55, IsDeleted : false}},
              {$orderby : {_id : -1}}},
         "planSummary": IXSCAN {_id : 1},
         "client" : ip:port,
         "desc" : conn121254,
         "threadId" : 0x1234567,
         "connectionId" : 1254651,
         "locks" : {
             "Global" : r,
             "MMAPV1Journal" : r,
             "Database" : r,
             "Collection" : R
         },
         "waitingForLock" : false,
         "numYields" : 46963,
         "lockStats" : {
             "Global" : {acquireCount : { r : 93928}},
             "MMAPV1Journal" : {acquireCount : { r : 46964} , acquireWaitCount : { r : 2 }, timeAcquiringMicros: { r : 2 } },
             "Database" : {acquireCount : { r : 46964}},
             "Collection" : {acquireCount : { r : 46964}}
         }
       }
   ]
}

在shell上运行的查询(22ms)

db.collection.find({ParentId : 55, IsDeleted : false}).sort({_id : 1})

C#代码示例:

MongoClient client = new MongoClient("mongodb://MongosServer01:27017,MongosServer02:27017,MongosServer03:27017,MongosServer04:27017");
var collection = client.GetServer().GetDatabase("db").GetCollection<BsonDocument>("collection");
var cursor = collection.Find(Query.And(Query.EQ("ParentId" , 55),Query.EQ("IsDeleted" , false))).SetSortOrder("_id").SetLimit(20);

1 个答案:

答案 0 :(得分:0)

我认为您的差异与每个方法带来的Doc数量有关。 MongoChef的默认值约为50,在您的代码中,您可能会带上所有文档。

我希望你会发现它很有用

谢谢