为什么现有索引会减慢不使用该索引的查询?

时间:2015-09-01 02:34:03

标签: mongodb

我偶然发现了以下行为: 在一个只有两个字段(_id和d)的大约14000个文档的集合中,我做了一个繁重的查询,这不会花费很长时间,因为我的文档很少。

没有索引,但默认情况下为_id,查询为:

db.col.explain('executionStats').find({$or: [{_id: /^.*\bACCIDENT$/}, {d: /^.*\bACCIDENT.*$/}]}).limit(15)

抛出结果(相关部分):

"winningPlan" : {
            "stage" : "SUBPLAN",
            "inputStage" : {
                "stage" : "LIMIT",
                "limitAmount" : 0,
                "inputStage" : {
                    "stage" : "COLLSCAN",
                    "filter" : {
                        "$or" : [
                            {
                                "_id" : /^.*\bACCIDENT$/
                            },
                            {
                                "d" : /^.*\bACCIDENT.*$/
                            }
                        ]
                    },
                    "direction" : "forward"
                }
            }
        },
        "rejectedPlans" : [ ]
"nReturned" : 15,
"executionTimeMillis" : 26,
"totalKeysExamined" : 0,
"totalDocsExamined" : 9834,

然后我用

创建一个索引
  

db.col.createIndex({_ id:1,d:1})

然后使用explain运行相同的查询(再次只是相关部分):

"winningPlan" : {
    "stage" : "SUBPLAN",
    "inputStage" : {
        "stage" : "LIMIT",
        "limitAmount" : 0,
        "inputStage" : {
            "stage" : "COLLSCAN",
            "filter" : {
                "$or" : [
                    {
                        "_id" : /^.*\bACCIDENT$/
                    },
                    {
                        "d" : /^.*\bACCIDENT.*$/
                    }
                ]
            },
            "direction" : "forward"
        }
    }
},
"rejectedPlans" : [ ]

"nReturned" : 15,
"executionTimeMillis" : 57,
"totalKeysExamined" : 0,
"totalDocsExamined" : 9834,

正如您所看到的,获胜计划再次成为COLLSCAN,但这次花了两倍的时间。

所以,我很好奇是什么让mongodb花费了额外的时间。

我正在使用mongod 3.0.5。 查询是从mongo shell执行的,并做了其他类似结果的示例,包括一遍又一遍的相同查询。

0 个答案:

没有答案