spring-data - Spring Data MongoDB 慢 MongoTemplate.find() 性能

标签 spring-data spring-data-mongodb mongotemplate mongodb-indexes

我在查询约 12,000 个用户文档时遇到性能问题,按 1 列 (companyId) 索引,没有其他过滤器。整个收藏只有 ~27000。我花了大约 12 秒来获取 ~12000 行数据...

我试着为这个查询运行解释: db.instoreMember.find({companyId:"5b6be3e2096abd567974f924"}).explain();

结果如下:

{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "production.instoreMember",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "companyId" : {
                "$eq" : "5b6be3e2096abd567974f924"
            }
        },
        "winningPlan" : {
            "stage" : "FETCH",
            "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "companyId" : 1,
                    "name" : 1,
                    "phoneNumber" : 1
                },
                "indexName" : "companyId_1_name_1_phoneNumber_1",
                "isMultiKey" : false,
                "multiKeyPaths" : {
                    "companyId" : [ ],
                    "name" : [ ],
                    "phoneNumber" : [ ]
                },
                "isUnique" : true,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 2,
                "direction" : "forward",
                "indexBounds" : {
                    "companyId" : [
                        "[\"5b6be3e2096abd567974f924\", \"5b6be3e2096abd567974f924\"]"
                    ],
                    "name" : [
                        "[MinKey, MaxKey]"
                    ],
                    "phoneNumber" : [
                        "[MinKey, MaxKey]"
                    ]
                }
            }
        },
        "rejectedPlans" : [
            {
                "stage" : "FETCH",
                "inputStage" : {
                    "stage" : "IXSCAN",
                    "keyPattern" : {
                        "companyId" : 1
                    },
                    "indexName" : "companyId_1",
                    "isMultiKey" : false,
                    "multiKeyPaths" : {
                        "companyId" : [ ]
                    },
                    "isUnique" : false,
                    "isSparse" : false,
                    "isPartial" : false,
                    "indexVersion" : 2,
                    "direction" : "forward",
                    "indexBounds" : {
                        "companyId" : [
                            "[\"5b6be3e2096abd567974f924\", \"5b6be3e2096abd567974f924\"]"
                        ]
                    }
                }
            }
        ]
    },
    "serverInfo" : {

    },
    "ok" : 1
}

看来实际上是在使用索引的companyId字段,如果我直接通过mongodb shell进行搜索,速度非常快:仅需1~2秒。

但是通过 Spring MongoDB 数据 - MongoTemplate:

final Query query = new Query().addCriteria(Criteria.where("companyId").is(adminCompanyId));
final List<InstoreMember> listOfInstoreMembers = mongoTemplate.find(query, InstoreMember.class);

这变得非常慢 ~10-12 秒。 (我如何测量是我在 find 语句处放置了一个断点,让它单步执行到下一行,这大约需要 10-12 秒)

我已经为 mongodb spring bootstrap 添加了 DEBUG 行,这里是 find 语句的记录输出:

2018-08-14 23:53:34.493 DEBUG 22733 --- [bio-8080-exec-2] o.s.data.mongodb.core.MongoTemplate      : 
find using query: { "companyId" : "58fa36dd31d103038e64b061"} fields: null for class: class fn.model.InstoreMember in collection: instoreMember

我使用的 spring-data-mongodb 版本:

compile ("org.springframework.data:spring-data-mongodb:1.10.7.RELEASE")

最佳答案

我遇到了这个问题。

缓慢的部分是将 Document 映射到 Java 对象。 Mongo 模板不映射到编解码器级别,因此它进入 bson->Document->POJO。如果您只使用带有 POJO 编解码器的 mongo 驱动程序,那么它将转到 bson->pojo 并删除模板映射层开销。

此外,如果您有旧数据并移动了包,这也会破坏它们的映射层并使其在回退到反射时变得非常慢。

关于spring-data - Spring Data MongoDB 慢 MongoTemplate.find() 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51836490/

相关文章:

java - 在 Spring Data Jpa Repository 而不是实体中设置表名称

java - JpaRepository.findOne() 对 JpaRepository.getOne() 的影响

java - Spring Data MongoDB : BigInteger to ObjectId conversion

java - 将文档从一个集合移动到另一个集合会覆盖该文档

java - 为什么我的 Mongo 聚合不能在嵌套文档上正常工作?

mongodb - Mongo 聚合映射和查询以使用 Mongo 模板获取特定年份的选择性记录

java - Spring JPA 存储库无法捕获 EntityNotFoundException

java - spring JpaRepository 方法的 stub

java - 如何将带有动态键的文档映射到 Spring MongoDb 实体类

java - 另一个服务 JAR 正在创建 Spring 的自动配置(创建名称为 'mongoTemplate' 的 bean 时出错)