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

时间:2012-04-03 09:13:08

标签: mongodb mongodb-.net-driver

我正在尝试从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

5 个答案:

答案 0 :(得分:3)

Google网上论坛也提出了这个问题:

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

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

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

答案 1 :(得分:0)

答案 2 :(得分:0)

有几件事需要检查:

  1. 您的查询是correctly indexed吗?
  2. 如果您的查询已编入索引,那么数据本身在内存中的几率是多少?如果你有20GB的数据和4GB的RAM,那么你的大部分数据都而不是,这意味着你的磁盘正在做很多工作。
  3. 100k文件代表多少数据?如果您的文档非常大,他们可能会吸收所有可用的磁盘IO或可能是网络?你有足够的空间将它存储在客户端的RAM中吗?
  4. 您可以使用iostat常见的linux工具)或perfmon(在Windows下)检查磁盘使用情况。如果在查询运行时运行这些,您应该知道磁盘发生了什么。

    否则,您将不得不做一些关于这里有多少数据移动的推理。通常,返回100k对象的查询并不是非常快(不是在MongoDB或SQL中)。这比人类通常在一个屏幕上消耗的数据更多,因此您可能希望制作较小的批次并读取10k个对象10次而不是100k对象一次。

答案 3 :(得分:0)

如果不为集合创建索引,MongoDB将执行全表扫描 - 这是最慢的方法。

您可以为查询运行explain()。说明将告诉您哪些索引(如果有)用于查询,扫描的文档数和总查询持续时间。

如果您的查询遇到所有索引并且执行速度仍然很慢,那么您可能会遇到集合/ RAM大小的问题。

当收集数据+索引适合内存时,MongoDB是最快的。如果您的集合大小大于可用RAM,则性能下降非常大。<​​/ p>

您可以使用totalSize()totalIndexSize()validate()检查收藏品的大小(这些是shell命令)。

答案 4 :(得分:0)

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

比较使用.SetFields方法仅选择一个字段时的响应时间(请参阅此处How to retrieve a subset of fields using the C# MongoDB driver?示例)。如果响应时间明显加快,那么您就知道这就是问题所在。