#mongodb
#mongodb
Вопрос:
Контекст
=> Проверить редактирование!
Я запускаю некоторые запросы, в которых применяется сортировка и которые должны использовать преимущества индексов. Для некоторых индексов, для определенных запросов (aggregate) в данной среде запросы обходят индекс, и я пока не смог выяснить, почему.
Настройка
У меня есть коллекция mongo, которая содержит 3 индекса:
- _id
- определение.Имя
- определение.финансовый.рентабельность.основные моменты.prof_net
Я использую 2 запроса для проверки использования каждого индекса:
B. Поиск и сортировка запроса
db.getCollection('properties_po').find().sort({"definition.financial.profitability.highlights.prof_net" : 1.0 }).limit(1);
db.getCollection('properties_po').find().sort({"definition.name" : 1.0}).limit(1);
B. Агрегировать с помощью запроса сортировки
db.getCollection("properties_po").aggregate([{"$sort":{"definition.name":1.0}},{"$limit":1}])
db.getCollection("properties_po").aggregate([{"$sort":{"definition.financial.profitability.highlights.prof_net":1.0}},{"$limit":1}])
Я использую db.properties_po.aggregate( [ { $indexStats: { } } ] )
, чтобы проверить, увеличивалось ли использование индекса после каждого запроса.
Результаты
Среда 1 (локальная mongodb 3.4):
Оба запроса по обоим индексам работают должным образом, увеличивая значения каждого индекса после каждого запроса.
Среда 2 (prod monhodb 3.6):
Запросы A работают должным образом, и использование индекса увеличивается после каждого запроса и для каждого индекса.
Запрос B работает для индекса «definition.name » где использование индекса увеличивается должным образом.
Запрос B не работает для определения индекса «.финансовый.рентабельность.выделяет.prof_net», где индекс не используется (очень медленный запрос), поскольку это отражается в том, что использование индекса не увеличивается.
Я не уверен, на что смотреть, возможно, мне не хватает какой-то конфигурации mongodb, какого-то ограничения атрибута вложенного документа или, возможно, мой индекс создан неправильно.
Спасибо за вашу помощь
РЕДАКТИРОВАТЬ 18/03 Это не связано с версией mongodb, поскольку я только что протестировал создание той же коллекции на сервере prod, и там у меня тоже есть 2 разных результата.
Коллекция 1: 15026 записывает выходные данные агрегированного запроса с объяснением:
db.getCollection("properties").explain("executionStats").aggregate([{"$sort":{"definition.financial.profitability.highlights.prof_net":1.0}},{"$limit":1}])
—
{
"stages" : [
{
"$cursor" : {
"query" : {
},
"queryPlanner" : {
"plannerVersion" : 1.0,
"namespace" : "collec.properties",
"indexFilterSet" : false,
"parsedQuery" : {
},
"winningPlan" : {
"stage" : "COLLSCAN",
"direction" : "forward"
},
"rejectedPlans" : [
]
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 15026.0,
"executionTimeMillis" : 1522.0,
"totalKeysExamined" : 0.0,
"totalDocsExamined" : 15026.0,
"executionStages" : {
"stage" : "COLLSCAN",
"nReturned" : 15026.0,
"executionTimeMillisEstimate" : 1506.0,
"works" : 15028.0,
"advanced" : 15026.0,
"needTime" : 1.0,
"needYield" : 0.0,
"saveState" : 128.0,
"restoreState" : 128.0,
"isEOF" : 1.0,
"invalidates" : 0.0,
"direction" : "forward",
"docsExamined" : 15026.0
}
}
}
},
{
"$sort" : {
"sortKey" : {
"definition.financial.profitability.highlights.prof_net" : 1.0
},
"limit" : NumberLong(1)
}
}
],
"ok" : 1.0
}
Коллекция 2: 2 записи
Тот же вывод запроса:
db.getCollection("properties_pl").explain("executionStats").aggregate([{"$sort":{"definition.financial.profitability.highlights.prof_net":1.0}},{"$limit":1}])
—
{
"stages" : [
{
"$cursor" : {
"query" : {
},
"sort" : {
"definition.financial.profitability.highlights.prof_net" : 1.0
},
"limit" : NumberLong(1),
"queryPlanner" : {
"plannerVersion" : 1.0,
"namespace" : "patrimmoine.properties_pl",
"indexFilterSet" : false,
"parsedQuery" : {
},
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"definition.financial.profitability.highlights.prof_net" : 1.0
},
"indexName" : "definition.financial.profitability.highlights.prof_net_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"definition.financial.profitability.highlights.prof_net" : [
]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2.0,
"direction" : "forward",
"indexBounds" : {
"definition.financial.profitability.highlights.prof_net" : [
"[MinKey, MaxKey]"
]
}
}
},
"rejectedPlans" : [
]
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 2.0,
"executionTimeMillis" : 0.0,
"totalKeysExamined" : 2.0,
"totalDocsExamined" : 2.0,
"executionStages" : {
"stage" : "FETCH",
"nReturned" : 2.0,
"executionTimeMillisEstimate" : 0.0,
"works" : 3.0,
"advanced" : 2.0,
"needTime" : 0.0,
"needYield" : 0.0,
"saveState" : 1.0,
"restoreState" : 1.0,
"isEOF" : 1.0,
"invalidates" : 0.0,
"docsExamined" : 2.0,
"alreadyHasObj" : 0.0,
"inputStage" : {
"stage" : "IXSCAN",
"nReturned" : 2.0,
"executionTimeMillisEstimate" : 0.0,
"works" : 3.0,
"advanced" : 2.0,
"needTime" : 0.0,
"needYield" : 0.0,
"saveState" : 1.0,
"restoreState" : 1.0,
"isEOF" : 1.0,
"invalidates" : 0.0,
"keyPattern" : {
"definition.financial.profitability.highlights.prof_net" : 1.0
},
"indexName" : "definition.financial.profitability.highlights.prof_net_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"definition.financial.profitability.highlights.prof_net" : [
]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2.0,
"direction" : "forward",
"indexBounds" : {
"definition.financial.profitability.highlights.prof_net" : [
"[MinKey, MaxKey]"
]
},
"keysExamined" : 2.0,
"seeks" : 1.0,
"dupsTested" : 0.0,
"dupsDropped" : 0.0,
"seenInvalidated" : 0.0
}
}
}
}
}
],
"ok" : 1.0
}
Таким образом, один запрос действительно не использует никакого индекса и выполняет «COLLSCAN», в то время как другой выполняет «ВЫБОРКУ» с помощью «IXSCAN».
Итак, теперь мой запрос таков: как содержимое коллекции может изменить поведение запроса?
Комментарии:
1. Вы перепутали a) и b), поэтому не совсем ясно, в чем проблема.
2. Действительно, извините за это, просто исправил это.