MongoDB拒绝使用索引交集

时间:2014-08-12 11:28:22

标签: mongodb mongodb-indexes

我使用的是MongoDB 2.6.4。

我的索引如下所示:

    {
            "v" : 1,
            "key" : {
                    "isFolder" : 1
            },
            "name" : "isFolder_1",
            "ns" : "Tenant_51.files",
            "background" : true
    },
    {
            "v" : 1,
            "key" : {
                    "isForeign" : 1
            },
            "name" : "isForeign_1",
            "ns" : "Tenant_51.files",
            "background" : true
    },

我的查询如下:

db.files.find({ isFolder: true, isForeign: false }).explain(true)

出于某种原因,它选择只使用1个索引(非常慢:680秒!!)

看起来它确实计算了复杂计划,然而,决定不使用它,我不明白为什么。 这是执行计划:

{
        "cursor" : "BtreeCursor isFolder_1",
        "isMultiKey" : false,
        "n" : 107441,
        "nscannedObjects" : 110580,
        "nscanned" : 110580,
        "nscannedObjectsAllPlans" : 110689,
        "nscannedAllPlans" : 110801,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 21056,
        "nChunkSkips" : 0,
        "millis" : 679121,
        "indexBounds" : {
                "isFolder" : [
                        [
                                true,
                                true
                        ]
                ]
        },
        "allPlans" : [
                {
                        "cursor" : "BtreeCursor isFolder_1",
                        "isMultiKey" : false,
                        "n" : 107441,
                        "nscannedObjects" : 110580,
                        "nscanned" : 110580,
                        "scanAndOrder" : false,
                        "indexOnly" : false,
                        "nChunkSkips" : 0,
                        "indexBounds" : {
                                "isFolder" : [
                                        [
                                                true,
                                                true
                                        ]
                                ]
                        }
                },
                {
                        "cursor" : "BtreeCursor isForeign_1",
                        "isMultiKey" : false,
                        "n" : 68,
                        "nscannedObjects" : 109,
                        "nscanned" : 110,
                        "scanAndOrder" : false,
                        "indexOnly" : false,
                        "nChunkSkips" : 0,
                        "indexBounds" : {
                                "isForeign" : [
                                        [
                                                false,
                                                false
                                        ]
                                ]
                        }
                },
                {
                        "cursor" : "Complex Plan",
                        "n" : 42,
                        "nscannedObjects" : 0,
                        "nscanned" : 111,
                        "nChunkSkips" : 0
                }
        ],
        "server" : "XXX",
        "filterSet" : false,
        "stats" : {
                "type" : "KEEP_MUTATIONS",
                "works" : 128743,
                "yields" : 21056,
                "unyields" : 21056,
                "invalidates" : 13834,
                "advanced" : 107441,
                "needTime" : 3140,
                "needFetch" : 18161,
                "isEOF" : 1,
                "children" : [
                        {
                                "type" : "FETCH",
                                "works" : 128743,
                                "yields" : 21056,
                                "unyields" : 21056,
                                "invalidates" : 13834,
                                "advanced" : 107441,
                                "needTime" : 3140,
                                "needFetch" : 18161,
                                "isEOF" : 1,
                                "alreadyHasObj" : 0,
                                "forcedFetches" : 0,
                                "matchTested" : 107441,
                                "children" : [
                                        {
                                                "type" : "IXSCAN",
                                                "works" : 110581,
                                                "yields" : 21056,
                                                "unyields" : 21056,
                                                "invalidates" : 13834,
                                                "advanced" : 110580,
                                                "needTime" : 1,
                                                "needFetch" : 0,
                                                "isEOF" : 1,
                                                "keyPattern" : "{ isFolder: 1 }",
                                                "isMultiKey" : 0,
                                                "boundsVerbose" : "field #0['isFolder']: [true, true]",
                                                "yieldMovedCursor" : 0,
                                                "dupsTested" : 0,
                                                "dupsDropped" : 0,
                                                "seenInvalidated" : 0,
                                                "matchTested" : 0,
                                                "keysExamined" : 110580,
                                                "children" : [ ]
                                        }
                                ]
                        }
                ]
        }
}

1 个答案:

答案 0 :(得分:-4)

来自MongoDB docs about indexing

  

MongoDB只能使用一个索引来支持任何给定的操作。

然而,解决方案与解释一样简单:使用复合索引。

db.files.ensureIndex({isFolder:1,isForeign:1})