我遇到了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);
答案 0 :(得分:0)
我认为您的差异与每个方法带来的Doc数量有关。 MongoChef的默认值约为50,在您的代码中,您可能会带上所有文档。
我希望你会发现它很有用
谢谢