查询速度非常慢,并且不使用索引-MongoDB

查询速度非常慢,并且不使用索引-MongoDB,mongodb,Mongodb,我使用facet来减少索引内存分配 以下是其中一个文档的示例(集合中有超过一百万个文档): 有更多字段,但与案例无关 “f”字段描述面。这些是我为我必须进行的查询创建的索引: { "f.t" : 1, "f.v" : 1, "ai" : -1 } 以及: 现在,我尝试执行的查询是: db.items.find({"$and": [ {"f": {"$elemMatch": {t: "ml", v: {"$in": ["English", "Spanish

我使用facet来减少索引内存分配

以下是其中一个文档的示例(集合中有超过一百万个文档):

有更多字段,但与案例无关

“f”字段描述面。这些是我为我必须进行的查询创建的索引:

{
    "f.t" : 1,
    "f.v" : 1,
    "ai" : -1
}
以及:

现在,我尝试执行的查询是:

db.items.find({"$and": [
        {"f": {"$elemMatch": {t: "ml", v: {"$in": ["English", "Spanish", "French", "German"]}}}}, 
        {"f": {"$elemMatch": {t: "rel", v: true}}}, 
        {"f": {"$elemMatch": {t: "k", v: "movie"}}}, 
        {"f": {"$elemMatch": {t: "ry", v: 2014}}}, 
        {"f": {"$elemMatch": {t: "g", v: {"$in": ["Action"]}}}}
]
}).limit(12)
这需要永远。恐怕在服务器级内存分配方面可能存在一些问题

下面是explain()文档:

{
    "cursor": "BtreeCursor f.t_1_f.v_1_ai_-1",
    "isMultiKey": true,
    "n": 12,
    "nscannedObjects": 228327,
    "nscanned": 228327,
    "nscannedObjectsAllPlans": 228327,
    "nscannedAllPlans": 228327,
    "scanAndOrder": false,
    "indexOnly": false,
    "nYields": 87096,
    "nChunkSkips": 0,
    "millis": 120605,
    "indexBounds": {
    "f.t": [
        [
            "rel",
            "rel"
        ]
    ],
    "f.v": [
        [
            true,
            true
        ]
    ],
    "ai": [
        [{
            "$maxElement": 1
        }, {
            "$minElement": 1
        }]
    ]
    },
    "server": "h00222.mongolab.com:42100",
    "filterSet": false,
    "stats": {
    "type": "LIMIT",
    "works": 315226,
    "yields": 87096,
    "unyields": 87096,
    "invalidates": 0,
    "advanced": 12,
    "needTime": 228315,
    "needFetch": 86899,
    "isEOF": 1,
    "children": [{
        "type": "KEEP_MUTATIONS",
        "works": 315226,
        "yields": 87096,
        "unyields": 87096,
        "invalidates": 0,
        "advanced": 12,
        "needTime": 228315,
        "needFetch": 86899,
        "isEOF": 0,
        "children": [{
            "type": "FETCH",
            "works": 315226,
            "yields": 87096,
            "unyields": 87096,
            "invalidates": 0,
            "advanced": 12,
            "needTime": 228315,
            "needFetch": 86899,
            "isEOF": 0,
            "alreadyHasObj": 0,
            "forcedFetches": 0,
            "matchTested": 12,
            "children": [{
                "type": "IXSCAN",
                "works": 228327,
                "yields": 87096,
                "unyields": 87096,
                "invalidates": 0,
                "advanced": 228327,
                "needTime": 0,
                "needFetch": 0,
                "isEOF": 0,
                "keyPattern": "{ f.t: 1.0, f.v: 1.0, ai: -1.0 }",
                "isMultiKey": 1,
                "boundsVerbose": "field #0['f.t']: [\"rel\", \"rel\"], field #1['f.v']: [true, true], field #2['ai']: [MaxKey, MinKey]",
                "yieldMovedCursor": 0,
                "dupsTested": 228327,
                "dupsDropped": 0,
                "seenInvalidated": 0,
                "matchTested": 0,
                "keysExamined": 228327,
                "children": []
            }]
        }]
    }]
    }
}
对可能发生的事情有什么想法吗


谢谢。

当您尝试将$and子句的各个元素作为单独的查询运行时,索引是否可以用于所有查询?是的,它可以@Philippy根据解释,它确实使用索引来最初缩小搜索范围。然后它继续扫描/过滤实际文档。如果是在mysql中,那么这个查询将是一个6表连接,其中5个表是facets表。您可能不应该期望它能像一个更简单的查询那样执行。我对mongo的内部工作还不太熟悉,不能说这是“出于设计”,是一个疏忽还是一个bug。
db.items.find({"$and": [
        {"f": {"$elemMatch": {t: "ml", v: {"$in": ["English", "Spanish", "French", "German"]}}}}, 
        {"f": {"$elemMatch": {t: "rel", v: true}}}, 
        {"f": {"$elemMatch": {t: "k", v: "movie"}}}, 
        {"f": {"$elemMatch": {t: "ry", v: 2014}}}, 
        {"f": {"$elemMatch": {t: "g", v: {"$in": ["Action"]}}}}
]
}).limit(12)
{
    "cursor": "BtreeCursor f.t_1_f.v_1_ai_-1",
    "isMultiKey": true,
    "n": 12,
    "nscannedObjects": 228327,
    "nscanned": 228327,
    "nscannedObjectsAllPlans": 228327,
    "nscannedAllPlans": 228327,
    "scanAndOrder": false,
    "indexOnly": false,
    "nYields": 87096,
    "nChunkSkips": 0,
    "millis": 120605,
    "indexBounds": {
    "f.t": [
        [
            "rel",
            "rel"
        ]
    ],
    "f.v": [
        [
            true,
            true
        ]
    ],
    "ai": [
        [{
            "$maxElement": 1
        }, {
            "$minElement": 1
        }]
    ]
    },
    "server": "h00222.mongolab.com:42100",
    "filterSet": false,
    "stats": {
    "type": "LIMIT",
    "works": 315226,
    "yields": 87096,
    "unyields": 87096,
    "invalidates": 0,
    "advanced": 12,
    "needTime": 228315,
    "needFetch": 86899,
    "isEOF": 1,
    "children": [{
        "type": "KEEP_MUTATIONS",
        "works": 315226,
        "yields": 87096,
        "unyields": 87096,
        "invalidates": 0,
        "advanced": 12,
        "needTime": 228315,
        "needFetch": 86899,
        "isEOF": 0,
        "children": [{
            "type": "FETCH",
            "works": 315226,
            "yields": 87096,
            "unyields": 87096,
            "invalidates": 0,
            "advanced": 12,
            "needTime": 228315,
            "needFetch": 86899,
            "isEOF": 0,
            "alreadyHasObj": 0,
            "forcedFetches": 0,
            "matchTested": 12,
            "children": [{
                "type": "IXSCAN",
                "works": 228327,
                "yields": 87096,
                "unyields": 87096,
                "invalidates": 0,
                "advanced": 228327,
                "needTime": 0,
                "needFetch": 0,
                "isEOF": 0,
                "keyPattern": "{ f.t: 1.0, f.v: 1.0, ai: -1.0 }",
                "isMultiKey": 1,
                "boundsVerbose": "field #0['f.t']: [\"rel\", \"rel\"], field #1['f.v']: [true, true], field #2['ai']: [MaxKey, MinKey]",
                "yieldMovedCursor": 0,
                "dupsTested": 228327,
                "dupsDropped": 0,
                "seenInvalidated": 0,
                "matchTested": 0,
                "keysExamined": 228327,
                "children": []
            }]
        }]
    }]
    }
}