Оптимизация индекса для фреймворка агрегации mongodb

У меня есть match-unwind-group-sort конвейер агрегации в mongo 2.4.4, и мне нужно ускорить агрегацию.

Операция сопоставления состоит из запросов диапазона по 16 полям. Я использовал метод .explain() для оптимизации запросов диапазона (т. Е. Создания составных индексов). Есть ли аналогичная функция для оптимизации агрегации? Я ищу что-то вроде:

db.col.aggregate([]).explain()

Кроме того, правильно ли я сосредоточился на оптимизации индекса?


person Tom Swifty    schedule 25.10.2013    source источник
comment
В последней нестабильной версии есть: jira.mongodb.org/browse/SERVER-4504 но до тех пор нет, и нет никаких индексов, используемых после mathc, поскольку такая оптимизация индекса не является хорошим путем   -  person Sammaye    schedule 25.10.2013
comment
@Sammaye, это неправильно, match, скорее всего, использует индексы, как и sort.   -  person Asya Kamsky    schedule 30.10.2013
comment
@AsyaKamsky Это то, что я только что сказал, я на самом деле сказал ПОСЛЕ матча, т.е. в группе $   -  person Sammaye    schedule 30.10.2013
comment
Оптимизация индекса - единственный путь к повышению производительности.   -  person Asya Kamsky    schedule 30.10.2013
comment
@AsyaKamsky нет, если вы уже оптимизировали его, как он сказал в своем вопросе   -  person Sammaye    schedule 30.10.2013


Ответы (1)


Что касается первого вопроса, да, вы можете объяснить агрегаты.

db.collection.runCommand("aggregate", {pipeline: YOUR_PIPELINE, explain: true})

Для второго индексы, которые вы создаете для оптимизации запросов диапазона, также будут применяться к этапу $ match конвейера агрегации, если они происходят в начале конвейера. Итак, вы правы, сосредоточившись на оптимизации индекса.

См. операторы конвейера и индексы.

Обновление 2

Подробнее о агрегировании и объяснении: в версии 2.4 это ненадежно; в версии 2.6+ он не предоставляет данные о выполнении запроса. https://groups.google.com/forum/#!topic/mongodb-user/2LzAkyaNqe0

Обновление 1

Стенограмма объяснения агрегирования на MongoDB 2.4.5.

$ mongo so
MongoDB shell version: 2.4.5
connecting to: so
> db.q19329239.runCommand("aggregate", {pipeline: [{$group: {_id: '$user.id', hits: {$sum: 1}}}, {$match: {hits: {$gt: 10}}}], explain: true})
{
    "serverPipeline" : [
        {
            "query" : {

            },
            "projection" : {
                "user.id" : 1,
                "_id" : 0
            },
            "cursor" : {
                "cursor" : "BasicCursor",
                "isMultiKey" : false,
                "n" : 1031,
                "nscannedObjects" : 1031,
                "nscanned" : 1031,
                "nscannedObjectsAllPlans" : 1031,
                "nscannedAllPlans" : 1031,
                "scanAndOrder" : false,
                "indexOnly" : false,
                "nYields" : 0,
                "nChunkSkips" : 0,
                "millis" : 0,
                "indexBounds" : {

                },
                "allPlans" : [
                    {
                        "cursor" : "BasicCursor",
                        "n" : 1031,
                        "nscannedObjects" : 1031,
                        "nscanned" : 1031,
                        "indexBounds" : {

                        }
                    }
                ],
                "server" : "ficrm-rafa.local:27017"
            }
        },
        {
            "$group" : {
                "_id" : "$user.id",
                "hits" : {
                    "$sum" : {
                        "$const" : 1
                    }
                }
            }
        },
        {
            "$match" : {
                "hits" : {
                    "$gt" : 10
                }
            }
        }
    ],
    "ok" : 1
}

Версия сервера.

$ mongo so
MongoDB shell version: 2.4.5
connecting to: so
> db.version()
2.4.5
person Rafa    schedule 25.10.2013
comment
вы можете объяснять запросы агрегации только в нестабильном продукте как таковом, не следует считать, что вы можете, вы должны сообщить человеку, что это не готово к производству, а версия нестабильна и может измениться - person Sammaye; 25.10.2013
comment
Нет, вы можете объяснить агрегаты в MongoDB 2.4. Я делаю это все время. - person Rafa; 25.10.2013
comment
Действительно?? Вы можете это доказать? Может быть, показать результат объяснения? - person Sammaye; 25.10.2013
comment
Кроме того, поскольку индекс используется только для $ match, $ skip $ sort и $ limit, если они происходят до раскрутки и группы, я не уверен в вашем утверждении, что он прав, сосредоточившись на индексе, который он уже оптимизировал. - person Sammaye; 25.10.2013
comment
Интересно, что я тоже могу объяснить. Хм, мне интересно, почему это не задокументировано, а также почему JIRA заявляет, что этого не должно быть - person Sammaye; 25.10.2013
comment
Спасибо за обсуждение. Я очень ценю помощь. Если я наткнусь на стену с помощью index opt, оставит ли это масштабирование с уменьшением карты как наиболее разумную альтернативу? - person Tom Swifty; 25.10.2013
comment
А, я знаю, почему, это не работает с сегментированием, поэтому функция все время была помечена как неполная, не могла этого увидеть, если вы немного не прочитали связанные задачи - person Sammaye; 25.10.2013
comment
@TomSwifty Это, вероятно, означает, что вам нужно изучить свой рабочий процесс, сокращение карты - очень медленная задача и предназначена для существенной агрегации с течением времени. - person Sammaye; 25.10.2013