MongoDB использует фильтр до IXSCAN, хотя составной индекс существует - PullRequest
0 голосов
/ 03 марта 2020

это моя схема:

{
    "_id" : ObjectId("5b726f066f8400317d55b9d7"),
    "question" : ObjectId("5b726bf66f8400317d54ea79"),
    "variableCollections" : [ 
        {
            "variableId" : ObjectId("5b726d746f8400317d553e9c"),
            "variableCollectionId" : ObjectId("5b726d2e6f8400317d54feda")
        }
    ]
}

это индекс схемы

{
    "question" : 1,
    "variableCollections.variableCollectionId" : 1,
    "variableCollections.variableId" : 1
}

Когда я пытаюсь выполнить следующий запрос даже с подсказкой или без нее. victoryPlan всегда делает фильтр $ eq до IXSCAN, но он должен был сразу использовать IXSCAN сразу без фильтра.

db.getCollection('questionAnswers').find({ 
        question: ObjectId('5b726bf66f8400317d54ea79'), 
        'variableCollections.variableId': ObjectId("5b726d746f8400317d553e9c"),
        'variableCollections.variableCollectionId':ObjectId("5b726d2e6f8400317d54feda")
    })
    .hint("test1")
    .explain({"verbosity":"allPlansExecution"})

WinPlan выглядит следующим образом

{
    "stage" : "FETCH",
    "filter" : {
        "variableCollections.variableId" : {
            "$eq" : ObjectId("5b726d746f8400317d553e9c")
        }
    },
    "inputStage" : {
        "stage" : "IXSCAN",
        "keyPattern" : {
            "question" : 1,
            "variableCollections.variableCollectionId" : 1,
            "variableCollections.variableId" : 1
        },
        "indexName" : "test1",
        "isMultiKey" : true,
        "multiKeyPaths" : {
            "question" : [],
            "variableCollections.variableCollectionId" : [ 
                "variableCollections"
            ],
            "variableCollections.variableId" : [ 
                "variableCollections"
            ]
        },
        "isUnique" : false,
        "isSparse" : false,
        "isPartial" : false,
        "indexVersion" : 2,
        "direction" : "forward",
        "indexBounds" : {
            "question" : [ 
                "[ObjectId('5b726bf66f8400317d54ea79'), ObjectId('5b726bf66f8400317d54ea79')]"
            ],
            "variableCollections.variableCollectionId" : [ 
                "[ObjectId('5b726d2e6f8400317d54feda'), ObjectId('5b726d2e6f8400317d54feda')]"
            ],
            "variableCollections.variableId" : [ 
                "[MinKey, MaxKey]"
            ]
        }
    }
}

Как заставить фор go использовать IXSCAN без использования $ eq в фильтре для повышения производительности этого запроса? или это уже лучшая производительность, которую я могу получить?

1 Ответ

0 голосов
/ 03 марта 2020

Насколько я знаю для операции поиска, MongoDB всегда использует операцию $ eq для внутреннего использования. Поэтому я думаю, что у вас есть лучший план запроса. Но не используйте много индексов, так как результат запроса может быть медленным.

...