Медленный запрос mongodb об изменении направления сортировки

#mongodb #indexing #query-optimization

Вопрос:

У меня есть кластер MongoDB 4.4 и база данных с коллекцией 200 тыс. документов и 55 индексами для различных запросов.

Следующий запрос:

 db.getCollection('tasks').find({
        "customer": "gZuu5ZptDEtC6dq2Z",
        "finished": true,
        "$or": [
            {
                "scoreCalculated": {
                    "$exists": true
                },

            },
            {
                "workflowProcessed": {
                    "$exists": true
                },

            }
        ]
    }).sort({
        "scoreCalculated": -1,
       "workflowProcessed": -1,
       "createdAt": -1
    })
 

выполняется в среднем менее чем за 1 секунду. Объяснять.

Но если я изменю направление сортировки на

 .sort({
        "scoreCalculated": 1,
       "workflowProcessed": 1,
       "createdAt": 1
    })
 

время выполнения увеличивается до нескольких секунд (до 10). Объяснять.

Первое объяснение показывает, что используется индекс apiGetTasks. Но у него есть сортировка по возрастанию, и я не понимаю, почему он не используется, когда я переключаю направление сортировки на возрастание. Добавление того же индекса с сортировкой по убыванию ничего не меняет.

Не могли бы вы, пожалуйста, помочь мне понять, почему второй запрос выполняется так медленно?

Комментарии:

1. не могли бы вы, пожалуйста, показать мне индексные апиГетТаски

2. Конечно @MoussabKbeisy { "scoreCalculated" : 1, "workflowProcessed" : 1, "createdAt" : 1 }

3. Вы можете узнать, почему запрос занимает больше времени, запустив объяснение (в режиме «executionStats») для обеих операций сортировки. Посмотрите, какой индекс используется для сортировки. Каковы другие операции в запросе? Они влияют на то, какой индекс используется или не используется.

4. @prasad_ Я приложил объяснение, сделанное с помощью «allPlansExecution» для каждого запроса на вопрос.

5. Согласно вашим результатам объяснения, индекс используется для сортировки — в обоих случаях.

Ответ №1:

Пожалуйста, поделитесь индексами.
55 индексов слишком много, вы должны уменьшить их, потому что это может повредить вашей производительности (каждый раз, когда вы хотите использовать индекс, вам нужно загружать его в оперативную память вместо того, чтобы позволить Монго использовать оперативную память для оптимизации запросов).
Более того, общее количество уничтоженных документов составляет 210780, и это вся ваша коллекция. Поэтому вам нужно пересмотреть способы эффективного построения индексов, которые помогут вам оптимизировать запросы.
Прочитать документы по индексам Mongo можно здесь