繁体   English   中英

使用c#api,Mongo Db记录检索速度非常慢

[英]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网上论坛也提出了这个问题:

https://groups.google.com/forum/?fromgroups#!topicsearchin/mongodb-user/100000/mongodb-user/a6FHFp5aOnA

当我回答谷歌小组的问题时,我试图重现这一点并且无法观察到任何缓慢。 我能够在2-3秒内读取100,000个文档,具体取决于文档是在接近开头还是接近结尾(因为我没有创建索引)。

我对Google群组问题的回答有更多详细信息,以及我过去尝试重现的测试程序的链接。

鉴于您提供的信息,我最好的猜测是您的文档大小太大,延迟不一定在mongo服务器上,而是在将结果集传输回您的应用程序机器上。 看看你的avg文档大小,你有大型嵌入式阵列吗?

比较使用.SetFields方法仅选择一个字段时的响应时间(请参阅此处的示例如何使用C#MongoDB驱动程序检索字段子集? )。 如果响应时间明显加快,那么您就知道这是问题所在。

有几件事需要检查:

  1. 您的查询是否正确编入索引
  2. 如果您的查询被编入索引,那么数据本身在内存中的几率是多少? 如果你有20GB的数据和4GB的RAM,那么你的大部分数据都不在内存中,这意味着你的磁盘正在做很多工作。
  3. 100k文件代表多少数据? 如果您的文档非常大,他们可能会吸收所有可用的磁盘IO或可能是网络? 您是否有足够的空间将其存储在客户端的RAM中?

您可以使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM