Индекс Mongodb не используется при агрегированном запросе

#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. Действительно, извините за это, просто исправил это.