MongoDb索引性能问题(mongodb或spring-batch)

时间:2017-08-22 06:19:30

标签: spring mongodb spring-batch mongodb-indexes

我的mongo系列中有1900万条记录。我的收藏品格式为:

{
    "_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索引的一个问题。

我的Mongo查询是:

{'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 个答案:

答案 0 :(得分:0)

Explain的获胜计划看起来很奇怪。也许您可以尝试使用$而不是$ in来定义范围。例如范围(20,60):

db.test.find({'field7_status': 'active', 'field8_status' : 'active', $and : [{'field4_id' : {$gt : 20}, }, {'field4_id' : {$lt : 60}, }] })

答案 1 :(得分:0)

谢谢大家问题已解决。实际上问题不在于索引,因为@Neil认为$ in是那里的罪魁祸首。我用$ lookup替换了$ in(参见MongoDb Post formatting of $lookup aggregation with limited data),我得到了结果。 谢谢@neil和其他人。