与Mongo Shell相比,Java MongoDB驱动程序的查询速度慢了40倍

时间:2018-01-22 12:37:03

标签: java mongodb mongodb-query spring-data-mongodb

与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]
...

提前谢谢。

0 个答案:

没有答案