У меня проблемы с производительностью при запросе ~ 12 000 пользовательских документов, индексированных по 1 столбцу (companyId), без другого фильтра. Всего в коллекции всего ~ 27000. Мне потребовалось около 12 секунд, чтобы получить ~ 12000 строк данных ...
Я попытался запустить объяснение для этого запроса: db.instoreMember.find ({companyId: "5b6be3e2096abd567974f924"}). Объяснять ();
результат следующий:
{
"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, это очень быстро: всего 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 секунд)
Я добавил строку DEBUG для начальной загрузки mongodb spring, и вот записанный вывод оператора 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")