Пересечение индексов MongoDB

#mongodb #indexing #mongodb-query

#mongodb #индексирование #mongodb-запрос

Вопрос:

Эй, я хочу оценить производительность пересечения индексов, но я не могу получить пересечение между двумя индексами. Я вставил несколько фиктивных записей в свою базу данных в соответствии с этим руководством. http://docs.mongodb.org/manual/core/index-intersection /

Вставить код:

 for(var i=0;i<1000;i  ){
    for(var j=0;j<100;j  ){
        db.t.insert({item:"abc" i,qty:j})
    }
}
  

Индексы:

 [
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "db.t"
    },
    {
        "v" : 1,
        "key" : {
            "qty" : 1
        },
        "name" : "qty_1",
        "ns" : "db.t"
    },
    {
        "v" : 1,
        "key" : {
            "item" : 1
        },
        "name" : "item_1",
        "ns" : "db.t"
    }
]
  

Запрос:

 db.t.find({item:"abc123",qty:{$gt:15}}).explain()
  

Результат объяснения:

 {
    "cursor" : "BtreeCursor item_1",
    "isMultiKey" : false,
    "n" : 84,
    "nscannedObjects" : 100,
    "nscanned" : 100,
    "nscannedObjectsAllPlans" : 201,
    "nscannedAllPlans" : 305,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 2,
    "nChunkSkips" : 0,
    "millis" : 1,
    "indexBounds" : {
        "item" : [
            [
                "abc123",
                "abc123"
            ]
        ]
    },
    "server" : "brews18:27017",
    "filterSet" : false
}
  

Мой вопрос в том, почему mongo использует item только в качестве индекса и не использует пересечение.

Заранее спасибо

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

1. Можете ли вы показать объяснение (true)? Я подозреваю, что это потому, что MongoDB действительно почувствовал, что быстрее загрузить 100 документов, а затем отфильтровать 16, чем загружать совершенно новый индекс, а затем пересекаться с ним

Ответ №1:

Ну, это действительно так, хотя в данном случае это не так. Чтобы действительно увидеть, что происходит, вам нужно взглянуть на «подробную» форму объяснения, добавив true :

 db.t.find({item:"abc123",qty:{$gt:15}}).explain(true)
{
    "cursor" : "BtreeCursor item_1",
    "isMultiKey" : false,
    "n" : 84,
    "nscannedObjects" : 100,
    "nscanned" : 100,
    "nscannedObjectsAllPlans" : 201,
    "nscannedAllPlans" : 304,
    "scanAndOrder" : false,
    "indexOnly" : false,
    "nYields" : 2,
    "nChunkSkips" : 0,
    "millis" : 2,
    "indexBounds" : {
            "item" : [
                    [
                            "abc123",
                            "abc123"
                    ]
            ]
    },
    "allPlans" : [
            {
                    "cursor" : "BtreeCursor item_1",
                    "isMultiKey" : false,
                    "n" : 84,
                    "nscannedObjects" : 100,
                    "nscanned" : 100,
                    "scanAndOrder" : false,
                    "indexOnly" : false,
                    "nChunkSkips" : 0,
                    "indexBounds" : {
                            "item" : [
                                    [
                                            "abc123",
                                            "abc123"
                                    ]
                            ]
                    }
            },
            {
                    "cursor" : "BtreeCursor qty_1",
                    "isMultiKey" : false,
                    "n" : 0,
                    "nscannedObjects" : 101,
                    "nscanned" : 102,
                    "scanAndOrder" : false,
                    "indexOnly" : false,
                    "nChunkSkips" : 0,
                    "indexBounds" : {
                            "qty" : [
                                    [
                                            15,
                                            Infinity
                                    ]
                            ]
                    }
            },
            {
                    "cursor" : "Complex Plan",
                    "n" : 0,
                    "nscannedObjects" : 0,
                    "nscanned" : 102,
                    "nChunkSkips" : 0
            }
    ],
  

Короче говоря, но последняя часть — это то, что вы ищете. Как объясняется в руководстве, появление «Сложного плана» означает, что используется пересечение.

             {
                    "cursor" : "Complex Plan",
                    "n" : 0,
                    "nscannedObjects" : 0,
                    "nscanned" : 102,
                    "nChunkSkips" : 0
            }
  

Единственный случай здесь заключается в том, что, хотя он «просматривается», оптимизатор в данном случае не выбирает его как наиболее «оптимальный» запрос. Итак, оптимизатор говорит, что на самом деле план, использующий только один выбранный индекс, является тем, который завершится наиболее гибким способом.

Таким образом, хотя «пересечение» было рассмотрено, оно не было «наилучшим образом подходящим», и был выбран единый индекс.