即使在清除查询计划缓存

时间:2017-10-04 14:14:52

标签: mongodb indexing mongodb-query mongodb-indexes

我有以下命令:

db.mycol.find({sourceId:ObjectId("596bac5a6f473e1a042bFFFF"),myFlag:false}).count()

花了很多时间。 所以我决定添加一个索引{ "sourceId" : -1, "myFlag" : -1 }

MongoDB仍然保持同一时间。

当我在find命令上运行explain()时,我注意到mongoDB仍然使用我的旧索引。

db.mycol.find({sourceId:ObjectId("596bac5a6f473e1a042bFFFF"),myFlag:false}).explain(true)
{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "mydb.mycol",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "$and" : [
                {
                    "sourceId" : {
                        "$eq" : ObjectId("596bac5a6f473e1a042bFFFF")
                    }
                },
                {
                    "myFlag" : {
                        "$eq" : false
                    }
                }
            ]
        },
        "winningPlan" : {
            "stage" : "FETCH",
            "filter" : {
                "myFlag" : {
                    "$eq" : false
                }
            },
            "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "sourceId" : 1
                },
                "indexName" : "sourceId_1",
                "isMultiKey" : false,
                "isUnique" : false,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 1,
                "direction" : "forward",
                "indexBounds" : {
                    "sourceId" : [
                        "[ObjectId('596bac5a6f473e1a042bFFFF'), ObjectId('596bac5a6f473e1a042bFFFF')]"
                    ]
                }
            }
        },
        "rejectedPlans" : [
            {
                "stage" : "FETCH",
                "filter" : {
                    "sourceId" : {
                        "$eq" : ObjectId("596bac5a6f473e1a042bFFFF")
                    }
                },
                "inputStage" : {
                    "stage" : "IXSCAN",
                    "keyPattern" : {
                        "myFlag" : -1
                    },
                    "indexName" : "myFlag_-1",
                    "isMultiKey" : false,
                    "isUnique" : false,
                    "isSparse" : false,
                    "isPartial" : false,
                    "indexVersion" : 1,
                    "direction" : "forward",
                    "indexBounds" : {
                        "myFlag" : [
                            "[false, false]"
                        ]
                    }
                }
            },
            {
                "stage" : "FETCH",
                "filter" : {
                    "myFlag" : {
                        "$eq" : false
                    }
                },
                "inputStage" : {
                    "stage" : "IXSCAN",
                    "keyPattern" : {
                        "sourceId" : -1,
                        "timestamp" : -1
                    },
                    "indexName" : "sourceId_-1_timestamp_-1",
                    "isMultiKey" : false,
                    "isUnique" : false,
                    "isSparse" : false,
                    "isPartial" : false,
                    "indexVersion" : 1,
                    "direction" : "forward",
                    "indexBounds" : {
                        "sourceId" : [
                            "[ObjectId('596bac5a6f473e1a042bFFFF'), ObjectId('596bac5a6f473e1a042bFFFF')]"
                        ],
                        "timestamp" : [
                            "[MaxKey, MinKey]"
                        ]
                    }
                }
            },
            {
                "stage" : "FETCH",
                "filter" : {
                    "myFlag" : {
                        "$eq" : false
                    }
                },
                "inputStage" : {
                    "stage" : "IXSCAN",
                    "keyPattern" : {
                        "sourceId" : -1,
                        "timestamp" : 1
                    },
                    "indexName" : "sourceId_-1_timestamp_1",
                    "isMultiKey" : false,
                    "isUnique" : false,
                    "isSparse" : false,
                    "isPartial" : false,
                    "indexVersion" : 1,
                    "direction" : "forward",
                    "indexBounds" : {
                        "sourceId" : [
                            "[ObjectId('596bac5a6f473e1a042bFFFF'), ObjectId('596bac5a6f473e1a042bFFFF')]"
                        ],
                        "timestamp" : [
                            "[MinKey, MaxKey]"
                        ]
                    }
                }
            },
            {
                "stage" : "FETCH",
                "inputStage" : {
                    "stage" : "IXSCAN",
                    "keyPattern" : {
                        "sourceId" : -1,
                        "myFlag" : -1
                    },
                    "indexName" : "sourceId_-1_myFlag_-1",
                    "isMultiKey" : false,
                    "isUnique" : false,
                    "isSparse" : false,
                    "isPartial" : false,
                    "indexVersion" : 1,
                    "direction" : "forward",
                    "indexBounds" : {
                        "sourceId" : [
                            "[ObjectId('596bac5a6f473e1a042bFFFF'), ObjectId('596bac5a6f473e1a042bFFFF')]"
                        ],
                        "myFlag" : [
                            "[false, false]"
                        ]
                    }
                }
            }
        ]
    },
    "executionStats" : {
        "executionSuccess" : true,
        "nReturned" : 2074,
        "executionTimeMillis" : 33936,
        "totalKeysExamined" : 2074,
        "totalDocsExamined" : 2074,
        "executionStages" : {
            "stage" : "FETCH",
            "filter" : {
                "myFlag" : {
                    "$eq" : false
                }
            },
            "nReturned" : 2074,
            "executionTimeMillisEstimate" : 31710,
            "works" : 2075,
            "advanced" : 2074,
            "needTime" : 0,
            "needYield" : 0,
            "saveState" : 1554,
            "restoreState" : 1554,
            "isEOF" : 1,
            "invalidates" : 0,
            "docsExamined" : 2074,
            "alreadyHasObj" : 0,
            "inputStage" : {
                "stage" : "IXSCAN",
                "nReturned" : 2074,
                "executionTimeMillisEstimate" : 0,
                "works" : 2075,
                "advanced" : 2074,
                "needTime" : 0,
                "needYield" : 0,
                "saveState" : 1554,
                "restoreState" : 1554,
                "isEOF" : 1,
                "invalidates" : 0,
                "keyPattern" : {
                    "sourceId" : 1
                },
                "indexName" : "sourceId_1",
                "isMultiKey" : false,
                "isUnique" : false,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 1,
                "direction" : "forward",
                "indexBounds" : {
                    "sourceId" : [
                        "[ObjectId('596bac5a6f473e1a042bFFFF'), ObjectId('596bac5a6f473e1a042bFFFF')]"
                    ]
                },
                "keysExamined" : 2074,
                "dupsTested" : 0,
                "dupsDropped" : 0,
                "seenInvalidated" : 0
            }
        },
        "allPlansExecution" : [
            {
                "nReturned" : 0,
                "executionTimeMillisEstimate" : 1630,
                "totalKeysExamined" : 101,
                "totalDocsExamined" : 101,
                "executionStages" : {
                    "stage" : "FETCH",
                    "filter" : {
                        "sourceId" : {
                            "$eq" : ObjectId("596bac5a6f473e1a042bFFFF")
                        }
                    },
                    "nReturned" : 0,
                    "executionTimeMillisEstimate" : 1630,
                    "works" : 101,
                    "advanced" : 0,
                    "needTime" : 101,
                    "needYield" : 0,
                    "saveState" : 1554,
                    "restoreState" : 1554,
                    "isEOF" : 0,
                    "invalidates" : 0,
                    "docsExamined" : 101,
                    "alreadyHasObj" : 0,
                    "inputStage" : {
                        "stage" : "IXSCAN",
                        "nReturned" : 101,
                        "executionTimeMillisEstimate" : 0,
                        "works" : 101,
                        "advanced" : 101,
                        "needTime" : 0,
                        "needYield" : 0,
                        "saveState" : 1554,
                        "restoreState" : 1554,
                        "isEOF" : 0,
                        "invalidates" : 0,
                        "keyPattern" : {
                            "myFlag" : -1
                        },
                        "indexName" : "myFlag_-1",
                        "isMultiKey" : false,
                        "isUnique" : false,
                        "isSparse" : false,
                        "isPartial" : false,
                        "indexVersion" : 1,
                        "direction" : "forward",
                        "indexBounds" : {
                            "myFlag" : [
                                "[false, false]"
                            ]
                        },
                        "keysExamined" : 101,
                        "dupsTested" : 0,
                        "dupsDropped" : 0,
                        "seenInvalidated" : 0
                    }
                }
            },
            {
                "nReturned" : 101,
                "executionTimeMillisEstimate" : 0,
                "totalKeysExamined" : 101,
                "totalDocsExamined" : 101,
                "executionStages" : {
                    "stage" : "FETCH",
                    "filter" : {
                        "myFlag" : {
                            "$eq" : false
                        }
                    },
                    "nReturned" : 101,
                    "executionTimeMillisEstimate" : 0,
                    "works" : 101,
                    "advanced" : 101,
                    "needTime" : 0,
                    "needYield" : 0,
                    "saveState" : 1554,
                    "restoreState" : 1554,
                    "isEOF" : 0,
                    "invalidates" : 0,
                    "docsExamined" : 101,
                    "alreadyHasObj" : 0,
                    "inputStage" : {
                        "stage" : "IXSCAN",
                        "nReturned" : 101,
                        "executionTimeMillisEstimate" : 0,
                        "works" : 101,
                        "advanced" : 101,
                        "needTime" : 0,
                        "needYield" : 0,
                        "saveState" : 1554,
                        "restoreState" : 1554,
                        "isEOF" : 0,
                        "invalidates" : 0,
                        "keyPattern" : {
                            "sourceId" : -1,
                            "timestamp" : -1
                        },
                        "indexName" : "sourceId_-1_timestamp_-1",
                        "isMultiKey" : false,
                        "isUnique" : false,
                        "isSparse" : false,
                        "isPartial" : false,
                        "indexVersion" : 1,
                        "direction" : "forward",
                        "indexBounds" : {
                            "sourceId" : [
                                "[ObjectId('596bac5a6f473e1a042bFFFF'), ObjectId('596bac5a6f473e1a042bFFFF')]"
                            ],
                            "timestamp" : [
                                "[MaxKey, MinKey]"
                            ]
                        },
                        "keysExamined" : 101,
                        "dupsTested" : 0,
                        "dupsDropped" : 0,
                        "seenInvalidated" : 0
                    }
                }
            },
            {
                "nReturned" : 101,
                "executionTimeMillisEstimate" : 10,
                "totalKeysExamined" : 101,
                "totalDocsExamined" : 101,
                "executionStages" : {
                    "stage" : "FETCH",
                    "filter" : {
                        "myFlag" : {
                            "$eq" : false
                        }
                    },
                    "nReturned" : 101,
                    "executionTimeMillisEstimate" : 10,
                    "works" : 101,
                    "advanced" : 101,
                    "needTime" : 0,
                    "needYield" : 0,
                    "saveState" : 1554,
                    "restoreState" : 1554,
                    "isEOF" : 0,
                    "invalidates" : 0,
                    "docsExamined" : 101,
                    "alreadyHasObj" : 0,
                    "inputStage" : {
                        "stage" : "IXSCAN",
                        "nReturned" : 101,
                        "executionTimeMillisEstimate" : 0,
                        "works" : 101,
                        "advanced" : 101,
                        "needTime" : 0,
                        "needYield" : 0,
                        "saveState" : 1554,
                        "restoreState" : 1554,
                        "isEOF" : 0,
                        "invalidates" : 0,
                        "keyPattern" : {
                            "sourceId" : -1,
                            "timestamp" : 1
                        },
                        "indexName" : "sourceId_-1_timestamp_1",
                        "isMultiKey" : false,
                        "isUnique" : false,
                        "isSparse" : false,
                        "isPartial" : false,
                        "indexVersion" : 1,
                        "direction" : "forward",
                        "indexBounds" : {
                            "sourceId" : [
                                "[ObjectId('596bac5a6f473e1a042bFFFF'), ObjectId('596bac5a6f473e1a042bFFFF')]"
                            ],
                            "timestamp" : [
                                "[MinKey, MaxKey]"
                            ]
                        },
                        "keysExamined" : 101,
                        "dupsTested" : 0,
                        "dupsDropped" : 0,
                        "seenInvalidated" : 0
                    }
                }
            },
            {
                "nReturned" : 101,
                "executionTimeMillisEstimate" : 0,
                "totalKeysExamined" : 101,
                "totalDocsExamined" : 101,
                "executionStages" : {
                    "stage" : "FETCH",
                    "nReturned" : 101,
                    "executionTimeMillisEstimate" : 0,
                    "works" : 101,
                    "advanced" : 101,
                    "needTime" : 0,
                    "needYield" : 0,
                    "saveState" : 1554,
                    "restoreState" : 1554,
                    "isEOF" : 0,
                    "invalidates" : 0,
                    "docsExamined" : 101,
                    "alreadyHasObj" : 0,
                    "inputStage" : {
                        "stage" : "IXSCAN",
                        "nReturned" : 101,
                        "executionTimeMillisEstimate" : 0,
                        "works" : 101,
                        "advanced" : 101,
                        "needTime" : 0,
                        "needYield" : 0,
                        "saveState" : 1554,
                        "restoreState" : 1554,
                        "isEOF" : 0,
                        "invalidates" : 0,
                        "keyPattern" : {
                            "sourceId" : -1,
                            "myFlag" : -1
                        },
                        "indexName" : "sourceId_-1_myFlag_-1",
                        "isMultiKey" : false,
                        "isUnique" : false,
                        "isSparse" : false,
                        "isPartial" : false,
                        "indexVersion" : 1,
                        "direction" : "forward",
                        "indexBounds" : {
                            "sourceId" : [
                                "[ObjectId('596bac5a6f473e1a042bFFFF'), ObjectId('596bac5a6f473e1a042bFFFF')]"
                            ],
                            "myFlag" : [
                                "[false, false]"
                            ]
                        },
                        "keysExamined" : 101,
                        "dupsTested" : 0,
                        "dupsDropped" : 0,
                        "seenInvalidated" : 0
                    }
                }
            },
            {
                "nReturned" : 101,
                "executionTimeMillisEstimate" : 0,
                "totalKeysExamined" : 101,
                "totalDocsExamined" : 101,
                "executionStages" : {
                    "stage" : "FETCH",
                    "filter" : {
                        "myFlag" : {
                            "$eq" : false
                        }
                    },
                    "nReturned" : 101,
                    "executionTimeMillisEstimate" : 0,
                    "works" : 101,
                    "advanced" : 101,
                    "needTime" : 0,
                    "needYield" : 0,
                    "saveState" : 88,
                    "restoreState" : 88,
                    "isEOF" : 0,
                    "invalidates" : 0,
                    "docsExamined" : 101,
                    "alreadyHasObj" : 0,
                    "inputStage" : {
                        "stage" : "IXSCAN",
                        "nReturned" : 101,
                        "executionTimeMillisEstimate" : 0,
                        "works" : 101,
                        "advanced" : 101,
                        "needTime" : 0,
                        "needYield" : 0,
                        "saveState" : 88,
                        "restoreState" : 88,
                        "isEOF" : 0,
                        "invalidates" : 0,
                        "keyPattern" : {
                            "sourceId" : 1
                        },
                        "indexName" : "sourceId_1",
                        "isMultiKey" : false,
                        "isUnique" : false,
                        "isSparse" : false,
                        "isPartial" : false,
                        "indexVersion" : 1,
                        "direction" : "forward",
                        "indexBounds" : {
                            "sourceId" : [
                                "[ObjectId('596bac5a6f473e1a042bFFFF'), ObjectId('596bac5a6f473e1a042bFFFF')]"
                            ]
                        },
                        "keysExamined" : 101,
                        "dupsTested" : 0,
                        "dupsDropped" : 0,
                        "seenInvalidated" : 0
                    }
                }
            }
        ]
    },
    "serverInfo" : {
        "host" : "gdm3d",
        "port" : 27017,
        "version" : "3.2.15",
        "gitVersion" : "e11e3c1b9c9ce3f7b4a79493e16f5e4504e01140"
    },
    "ok" : 1
}

出于某种原因,它拒绝使用sourceId_-1_myFlag_-1的计划并与sourceId_1一起使用,然后按文档过滤myFlag

当我强制它使用索引时,它立即返回结果!

db.mycol.find({sourceId:ObjectId("596bac5a6f473e1a042bFFFF"),myFlag:false}).hint("sourceId_-1_myFlag_-1").count()

我认为mongoDB定期运行所有计划并检查哪一个更快,然后再使用那个计划。
我甚至尝试重新启动mongodb,清除查询计划缓存,重新启动计算机。对于一些数据量非常少的sourceId,它确实自动使用了正确的索引(我检查了索引用法),然后再次使用旧索引。

我不想强迫它使用索引。我如何确保它自动执行此操作?

更新 一段时间后,它开始使用正确的一个。至少是indexStats所说的。 但是,该命令仍然需要时间,当我给它hint时,它会立即给出输出。

0 个答案:

没有答案