[英]Mongo Db records retrieval very slow using c# api
我试图从MongoDb中检索100000个docouments,如下所示,并且需要很长时间才能返回集合。
var query = Query.EQ("Status", "E");
var items = collection.Find(query).SetLimit(100000).ToList();
要么
var query = Query.GT("_id", idValue);
var items = collection.Find(query).SetLimit(100000).ToList();
说明:
{
"cursor" : "BtreeCursor _id_",
"nscanned" : 1,
"nscannedObjects" :1,
"n" : 1,
"millis" : 0,
"nYields" : 0,
"nChunkSkips" : 0,
"isMultiKey" : false,
"indexOnly" : false,
"indexBounds" :
{
"_id" :[[ObjectId("4f79a64eca98b5fc0e5ae35a"),
ObjectId("4f79a64eca98b5fc0e5ae35a")]]
}
}
任何提高查询性能的建议。 我的桌子有200万份文件。
-Venkat
Google网上论坛也提出了这个问题:
当我回答谷歌小组的问题时,我试图重现这一点并且无法观察到任何缓慢。 我能够在2-3秒内读取100,000个文档,具体取决于文档是在接近开头还是接近结尾(因为我没有创建索引)。
我对Google群组问题的回答有更多详细信息,以及我过去尝试重现的测试程序的链接。
鉴于您提供的信息,我最好的猜测是您的文档大小太大,延迟不一定在mongo服务器上,而是在将结果集传输回您的应用程序机器上。 看看你的avg文档大小,你有大型嵌入式阵列吗?
比较使用.SetFields方法仅选择一个字段时的响应时间(请参阅此处的示例如何使用C#MongoDB驱动程序检索字段子集? )。 如果响应时间明显加快,那么您就知道这是问题所在。
有几件事需要检查:
您可以使用iostat
( 常见的linux工具 )或perfmon
(在Windows下)检查磁盘使用情况。 如果在查询运行时运行这些,则应该了解磁盘发生的情况。
否则,您将不得不做一些关于这里有多少数据移动的推理。 通常,返回100k对象的查询并不是非常快(不是在MongoDB或SQL中)。 这比人类通常在一个屏幕上消耗的数据更多,因此您可能希望制作更小的批次并读取10k个对象10次而不是100k对象一次。
如果不为集合创建索引,MongoDB将执行全表扫描 - 这是最慢的方法。
您可以为查询运行explain() 。 说明将告诉您哪些索引(如果有)用于查询,扫描文档的数量和总查询持续时间。
如果您的查询命中所有索引并且执行速度仍然很慢,那么您可能会遇到集合/ RAM大小的问题。
当集合数据+索引适合内存时,MongoDB是最快的。 如果您的集合大小大于可用RAM,则性能下降非常大。
您可以使用totalSize()
, totalIndexSize()
或validate()
(这些是shell命令)检查集合的大小。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.