Как повысить производительность агрегированных запросов mon go - PullRequest
0 голосов
/ 07 мая 2020

Я создаю конвейер агрегации, который имеет следующие этапы:

[
    { $match: {field1: "ABC"} },
    {
        $project: {

            date: true,
            state: true,
        }
    },
    {
        $group: {
            _id: {
                formattedDate: { $dateToString: { format: "%Y-%m-%d", date: "$date" } },
                status: "$Status"
            },
            count: { $sum: 1 }
        }
    },
    {
        $project: {
            date: "$_id.formattedDate",
            state: "$_id.state",
            _id: false,
            count: true
        }
    }
]

Обратите внимание, что запрос {field1: "XYZ"} не является обязательным, поэтому он может быть там или нет для данного конвейера. Поэтому я добавил в свой агрегированный запрос подсказку, чтобы всегда использовать field1 в качестве целевого индекса.

Теперь перейдем к реальной проблеме: В коллекции более 1 миллиона документов, и у меня есть индекс для field1 . Ниже приведены результаты, которые я наблюдал

С запросом {field1: "XYZ"}

nReturned: 12,
docsExamined: 12,
totalKeysExamined: 22,
totalDocsExamined: 12,
executionTimeMillisEstimate: 0,
executionTimeMillis: 1

С запросом {field1: "AB C" }

nReturned: 100023,
docsExamined: 100023,
totalKeysExamined: 100023,
totalDocsExamined: 100023,
executionTimeMillisEstimate: 9,
executionTimeMillis: 368

Без запроса {}

nReturned: 1378246,
docsExamined: 1378246,
totalKeysExamined: 1378246,
totalDocsExamined: 1378246,
executionTimeMillisEstimate: 313,
executionTimeMillis: 6350

Во всех трех случаях Mon go выполняет IXSCAN, но последний трубопровод занимает около 7 секунд. Что я могу сделать для повышения производительности?

Мы очень ценим любые предложения.

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