我在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();
但因为内存耗尽而无法正常工作。 我的查询是否正确?感谢。
答案 0 :(得分:1)
你必须定义一个索引来加快速度。有4种可能性。
如果您对查询有索引支持,那么idfile上的索引会加快查询部分,但之后不支持排序,因此如果查询具有大的结果集,则必须面对慢速排序。 (正如Sammaye所说)。由于这种方式,索引是“小”,这可能是一个好方法。
如果你有一个排序阶段的索引,你将对集合进行全面扫描,这可能总是值得第一个案例。
打开复合索引(检查documentation){idfile:1,idrow:1}会有所帮助,直到你不可能运行基于范围的查询或类似的东西。当您仅查询单个字段单值对时,它将起作用并且将加快查询和排序。
如果您可能运行一个获取idfile的多个值的查询,那么值得考虑创建一个像{idrow:1,idfile:1}这样的复合索引,其中排序阶段将由结构支持扫描将排除索引和大量文档。只是要测试的东西。