#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 можно здесь