MongoDB медленно с индексом и сортировкой - PullRequest
0 голосов
/ 13 ноября 2018

у меня составной индекс:

{
    "hidden" : 1,
    "country" : 1,
    "edited" : 1,
    "changeset.when" : -1
}

И запрос:

{
    "country" : "ua",
    "edited" : true,
    "hidden" : false,
    "changeset.when" : { "$lt" : ISODate("5138-11-16T09:46:40Z") }
}

Работает хорошо и быстро. Теперь я хочу отсортировать результат по: { "changeset.when" : -1 }, и он сильно замедляется. От ста миллисекунд до 15 секунд.

А вот объяснение запроса с сортировкой:

"winningPlan" : {
    "stage" : "SORT",
    "sortPattern" : {
        "changeset.when" : -1
    },
    "limitAmount" : 15,
    "inputStage" : {
        "stage" : "SORT_KEY_GENERATOR",
        "inputStage" : {
            "stage" : "FETCH",
            "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "hidden" : 1,
                    "country" : 1,
                    "edited" : 1,
                    "changeset.when" : -1
                },
                "indexName" : "edited_news",
                "isMultiKey" : true,
                "multiKeyPaths" : {
                    "hidden" : [ ],
                    "country" : [ ],
                    "edited" : [ ],
                    "changeset.when" : [
                        "changeset"
                    ]
                },
                "isUnique" : false,
                "isSparse" : false,
                "isPartial" : false,
                "indexVersion" : 2,
                "direction" : "forward",
                "indexBounds" : {
                    "hidden" : [
                        "[false, false]"
                    ],
                    "country" : [
                        "[\"ua\", \"ua\"]"
                    ],
                    "edited" : [
                        "[true, true]"
                    ],
                    "changeset.when" : [
                        "(new Date(100000000000000), true)"
                    ]
                }
            }
        }
    }
}

Почему это так медленно? Объясните, что он успешно использует необходимый индекс и поле changeset.when находится в порядке убывания

1 Ответ

0 голосов
/ 14 ноября 2018

В случае, если у вас есть составной индекс, попробуйте создать последовательность ключей запроса, такую ​​как последовательность индекса. Это принесет больше производительности.

Вам не нужно делать дополнительную сортировку для результата, по умолчанию результат будет отсортирован по индексу (в вашем случае результат будет отсортирован по убыванию changeset.when)

Для получения дополнительной информации, пожалуйста, поделитесь некоторыми документами из вашей коллекции.

Если у вас есть какие-либо вопросы, не стесняйтесь спрашивать

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