Проблема производительности индексирования 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 и другим.

Другие вопросы по тегам