Почему здесь сканируются какие-либо объекты? - PullRequest
0 голосов
/ 19 марта 2012

У меня есть индекс:

{indices.textLc:1, group:1, lc:1, wordCount:1, pattern:1, clExists:1} 

, и Морфия генерирует запросы вроде:

{
    $and: [{
        lc: "eng"
    },
    {
        $or: [{
            group: "cn"
        },
        {
            group: "all"
        }]
    },
    {
        "indices.textLc": {
            $in: ["media strengthening", "strengthening", "media"]
        }
    },
    {
        wordCount: {
            $gte: 1
        }
    },
    {
        wordCount: {
            $lte: 2
        }
    }]
}

и объясняет, дает:

{
    "cursor" : "BtreeCursor indices.textLc_1_group_1_lc_1_wordCount_1_pattern_1_clExists_1 multi",
    "nscanned" : 20287,
    "nscannedObjects" : 20272,
    "n" : 22,
    "millis" : 677,
    "nYields" : 0,
    "nChunkSkips" : 0,
    "isMultiKey" : true,
    "indexOnly" : false,
    "indexBounds" : {
        "indices.textLc" : [
            [
                "media",
                "media"
            ],
            [
                "media strengthening",
                "media strengthening"
            ],
            [
                "strengthening",
                "strengthening"
            ]
        ],
        "group" : [
            [
                {
                    "$minElement" : 1
                },
                {
                    "$maxElement" : 1
                }
            ]
        ],
        "lc" : [
            [
                "eng",
                "eng"
            ]
        ],
        "wordCount" : [
            [
                1,
                1.7976931348623157e+308
            ]
        ],
        "pattern" : [
            [
                {
                    "$minElement" : 1
                },
                {
                    "$maxElement" : 1
                }
            ]
        ],
        "clExists" : [
            [
                {
                    "$minElement" : 1
                },
                {
                    "$maxElement" : 1
                }
            ]
        ]
    }

Во-первых, я неЯ не понимаю, почему требуется любое сканирование, так как все доступно в индексе.В частности, почему WordCount часть indexBounds не выглядит так:

 "wordCount" : [
            [
                1,
                2
            ]
        ],

Обновление 2012-03-20 : Если это поможет объяснить что-то, я использую MongoDB 2.0.3

1 Ответ

1 голос
/ 20 марта 2012

Каждое поле в вашем запросе, доступное в вашем составном индексе, очень мало говорит о том, может ли оно использовать ваш один индекс для каждого предложения в вашем запросе. Есть несколько вещей, которые следует учитывать:

  • За исключением $ или пунктов верхнего уровня, которые могут использовать индекс для каждого предложения, каждый запрос MongoDB может использовать не более одного индекса.
  • Составные индексы работают только в том случае, если каждое последующее поле в соединении можно использовать по порядку, то есть ваш запрос позволяет сначала фильтровать первое поле индекса, затем второе, и так далее. Поэтому, если у вас есть индекс {a: 1, b: 1}, запрос {b: "Hi!"} Не будет использовать индекс, даже если поле находится в составном индексе.

Теперь причина, по которой ваш запрос требует сканирования, заключается в том, что ваш индекс может оптимизировать только план выполнения запроса для поля «indices.textLc» (ваше первое поле индекса) и в данном конкретном случае «lc», потому что это отдельное предложение в ваших $ и.

Часть объяснения "wordCount" должна выглядеть следующим образом:

 "wordCount" : [
         [
                 1,
                 2
         ]
 ]

Я только что проверил это, и оно работает на моей машине, так что я думаю, что что-то не так с вашим решением Morphia / mapping там.

Сложные индексы и сложные запросы, такие как ваш, - сложная тема. У меня нет времени, чтобы посмотреть на ваш запрос и индекс и посмотреть, можно ли его оптимизировать. Я вернусь сегодня вечером и помогу вам, если смогу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...