我在查询约 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/