Mongo DB время запроса больше, чем ожидалось - PullRequest
0 голосов
/ 25 июня 2018

Я использую автономный сервер mongodb с версией 3.4.Я использую следующий запрос в своей коллекции, которая содержит около 1,8 миллиона документов, из которых около 1 миллиона документов находятся в состоянии «В АРХИВЕ».

db.tender_listing.find({ "tender_id" : { "$gt" : "d"} , "workflow_status" : { "$in" : [ "ARCHIVED"]}}).limit(4000).sort({tender_id:1}).hint({workflow_status:1, tender_id:1}).explain('executionStats')

Каждый этап запроса имеет значение executeTimeMillisEstimate не более 100 мс, но общееexecuteTimeMillis - 30992.

Для какой операции запрос занимает так много дополнительного времени?Кроме того, как я могу оптимизировать то же самое?

Следующий вывод

{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "ofbTenders.tender_listing",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "$and" : [
                {
                    "workflow_status" : {
                        "$eq" : "ARCHIVED"
                    }
                },
                {
                    "tender_id" : {
                        "$gt" : "d"
                    }
                }
            ]
        },
        "winningPlan" : {
            "stage" : "LIMIT",
            "limitAmount" : 4000,
            "inputStage" : {
                "stage" : "FETCH",
                "inputStage" : {
                    "stage" : "IXSCAN",
                    "keyPattern" : {
                        "workflow_status" : 1,
                        "tender_id" : 1
                    },
                    "indexName" : "workflow_status_1_tender_id_1",
                    "isMultiKey" : false,
                    "isUnique" : false,
                    "isSparse" : false,
                    "isPartial" : false,
                    "indexVersion" : 1,
                    "direction" : "forward",
                    "indexBounds" : {
                        "workflow_status" : [
                            "[\"ARCHIVED\", \"ARCHIVED\"]"
                        ],
                        "tender_id" : [
                            "(\"d\", {})"
                        ]
                    }
                }
            }
        },
        "rejectedPlans" : [ ]
    },
    "executionStats" : {
        "executionSuccess" : true,
        "nReturned" : 4000,
        "executionTimeMillis" : 30992,
        "totalKeysExamined" : 4000,
        "totalDocsExamined" : 4000,
        "executionStages" : {
            "stage" : "LIMIT",
            "nReturned" : 4000,
            "executionTimeMillisEstimate" : 90,
            "works" : 6129,
            "advanced" : 4000,
            "needTime" : 0,
            "needYield" : 2128,
            "saveState" : 2128,
            "restoreState" : 2128,
            "isEOF" : 1,
            "invalidates" : 0,
            "limitAmount" : 4000,
            "inputStage" : {
                "stage" : "FETCH",
                "nReturned" : 4000,
                "executionTimeMillisEstimate" : 80,
                "works" : 6128,
                "advanced" : 4000,
                "needTime" : 0,
                "needYield" : 2128,
                "saveState" : 2128,
                "restoreState" : 2128,
                "isEOF" : 0,
                "invalidates" : 0,
                "docsExamined" : 4000,
                "alreadyHasObj" : 0,
                "inputStage" : {
                    "stage" : "IXSCAN",
                    "nReturned" : 4000,
                    "executionTimeMillisEstimate" : 10,
                    "works" : 4000,
                    "advanced" : 4000,
                    "needTime" : 0,
                    "needYield" : 0,
                    "saveState" : 2128,
                    "restoreState" : 2128,
                    "isEOF" : 0,
                    "invalidates" : 0,
                    "keyPattern" : {
                        "workflow_status" : 1,
                        "tender_id" : 1
                    },
                    "indexName" : "workflow_status_1_tender_id_1",
                    "isMultiKey" : false,
                    "isUnique" : false,
                    "isSparse" : false,
                    "isPartial" : false,
                    "indexVersion" : 1,
                    "direction" : "forward",
                    "indexBounds" : {
                        "workflow_status" : [
                            "[\"ARCHIVED\", \"ARCHIVED\"]"
                        ],
                        "tender_id" : [
                            "(\"d\", {})"
                        ]
                    },
                    "keysExamined" : 4000,
                    "seeks" : 1,
                    "dupsTested" : 0,
                    "dupsDropped" : 0,
                    "seenInvalidated" : 0
                }
            }
        }
    },
    "serverInfo" : {
        "host" : "ofb59-Latitude-3450",
        "port" : 27017,
        "version" : "3.4.4",
        "gitVersion" : "888390515874a9debd1b6c5d36559ca86b44babd"
    },
    "ok" : 1
}

1 Ответ

0 голосов
/ 28 июня 2018

Я не уверен, но вы можете попробовать ниже вариант.1) вместо использования $ in для рабочего процесса вы можете напрямую указать «workflow_status»: «ARCHIVED» 2) изменить порядок полей в поиске сначала статуса рабочего процесса, а затем tender_id.3) запустить план выполнения запроса без подсказки.Пусть MongoDB решит, какой индекс использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...