0

我在 db 上进行了此查询,记录为 3.000.000,大小为 3GB:

int toskip=5000;
int limit=100;
MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
DB db = mongoClient.getDB( "mydb" );
DBCollection collection = db.getCollection("mycollection");
BasicDBObject query = new BasicDBObject("idfile",idfile);
BasicDBObject orderBy = new BasicDBObject("idrow",1);
List<DBObject> listElem = collection.find(query).sort(orderBy).skip(toskip).limit(limit).toArray();
mongoClient.close();

但由于内存不足而无法正常工作。我的查询是否正确?谢谢。

4

1 回答 1

1

您必须定义一个索引来加快速度。有4种可能。

如果您有查询的索引支持,那么 idfile 上的索引将加快查询部分,但不支持之后的排序,因此如果查询有大的结果集,您将不得不面对缓慢的排序。(正如 Sammaye 提到的那样)。由于这种方式,索引是“小”的,这可能是一个好方法。

如果您有排序阶段的索引,您将对集合进行全面扫描,这可能总是值得第一种情况。

在(查看文档){idfile:1, idrow:1}上有一个复合索引会有所帮助,直到您不太可能运行基于范围的查询或类似的东西。当您仅查询单个字段单值对时,它将起作用并且会加快查询和排序。

如果您可能运行一个为 idfile 获取多个值的查询,则值得考虑创建一个像 {idrow:1, idfile:1} 这样的复合索引,排序阶段将由索引的结构和批次支持的文档将被排除在扫描范围之外。只是要测试的东西。

于 2013-09-05T13:29:08.230 回答