与Mongo shell相比,使用Java Driver时,我的MongoDB慢了40多倍。我在1个集合和1个数据库中有1000000个文档(具有相同的模式)。
下面的Mongo Shell命令花了不到1毫秒。
> db.basket.find({appleId : "appleId-312093"}).explain("executionStats")
这是结果的一部分。
"nReturned" : 1,
"executionTimeMillis" : 0,
"totalKeysExamined" : 1,
"totalDocsExamined" : 1,
...
"indexName" : "appleId"
...
由于我在appleId上有索引,所以速度非常快。 但是使用下面的代码使用Java Driver,花了超过42毫秒。
@Test
public void elapsedTimeMongoDriver() {
MongoClient mongoClient = new MongoClient();
MongoCollection<Document> collection = mongoClient.getDatabase(DATABASE_NAME).getCollection(COLLECTION_NAME);
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Document doc = collection.find(eq("appleId", "appleId-329199"))
.hint(eq("appleId", 1)).first();
stopWatch.stop();
System.out.println(doc.toJson());
System.out.println("Total Elapsed: " + stopWatch.getTotalTimeMillis() + " milliseconds");
}
此外,当我使用Spring Data MongoDB时,下面的代码花了超过500毫秒。
@Test
public void elapsedTimeSpringMongo() {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Fruit fruit = mongoOperations.findOne(
query(where("appleId").is("appleId-329199"))
, Fruit.class
, COLLECTION_NAME);
stopWatch.stop();
System.out.println("Total Elapsed: " + stopWatch.getTotalTimeSeconds() + " seconds");
}
这只是因为我使用低效的方式来查询文档吗? 或者有没有办法像Mongo Shell一样快速查询?
关于索引,
@Test
public void index() {
IndexOperations indexOperations = mongoOperations.indexOps(COLLECTION_NAME);
indexOperations.getIndexInfo().stream().forEach(i -> {
i.getIndexFields().stream().forEach(System.out::println);
});
}
上述方法的输出是
...
IndexField [ key: appleId, direction: ASC, type: DEFAULT, weight: NaN]
...
提前谢谢。