Проблема производительности индексирования MongoDb (mongodb или spring-batch)
У меня есть 19 миллионов записей в моей коллекции монго. Формат моей коллекции:
{
"_id" : ObjectId("5992d5a5e7f31a5e90abb881"),
"_class" : "com.abc.Try",
"field1_code" : "mycode_sdsvmnsbd7986fskljfnsv89s7fmnslfsd78",
"field2_id" : "5992d5a5e7f31a5e90abb87e",
"field3_id" : NumberLong(1681703),
"field4_id" : NumberLong(40119344),
"field5_create_date" : ISODate("2015-05-15T09:17:46.000Z"),
"field6_update_date" : ISODate("2015-05-31T08:53:59.000Z"),
"field7_status" : "active",
"field8_status" : "active"
}
Я использую пакет Spring: org.springframework.batch.item.ItemReader<MyCollection>
читать мою коллекцию, но она читается довольно медленно. Поэтому я создал новый индекс с помощью команды:
db.monitoring_profile.createIndex({ field7_status: 1, field8_status: 1, field4_id: 1})
Все еще медленно. Пожалуйста, предложите. Я считаю, что это проблема индексации mongodb.
Мой Монго Запрос:
{'field7_status': 'active', 'field8_status' : 'active', 'field4_id': { $in: [.... 10000 values....] }}
Мой результат запроса объяснения:
db.coll.find({'field7_status': 'active', 'field8_status' : 'active', 'field4_id': { $in: [40009361, 40006884] }}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "mycollection.coll",
"indexFilterSet" : false,
"parsedQuery" : {
"$and" : [
{
"field7_status" : {
"$eq" : "active"
}
},
{
"field8_status" : {
"$eq" : "active"
}
},
{
"field4_id" : {
"$in" : [
40006884.0,
40009361.0
]
}
}
]
},
"winningPlan" : {
"stage" : "EOF"
},
"rejectedPlans" : []
},
"serverInfo" : {
"host" : ".......",
"port" : 27017,
"version" : "3.4.2",
"gitVersion" : "........"
},
"ok" : 1.0
}
2 ответа
Выигрышный план объяснения выглядит очень странно. Возможно, вы можете попытаться использовать $ и вместо $in для определения диапазона. Например диапазон (20, 60):
db.test.find({'field7_status': 'active', 'field8_status' : 'active', $and : [{'field4_id' : {$gt : 20}, }, {'field4_id' : {$lt : 60}, }] })
Спасибо всем. Проблема решена. На самом деле проблема была не в индексации, так как @Neil предполагает, что виновником был $ in. Я заменил $ in на $lookup (см. MongoDb Post отформатирования агрегации $ lookup с ограниченными данными), и я получаю результаты. Спасибо @neil и другим.