Анализ запросов MongoDB

Анализ запросов MongoDB позволяет убедиться, эффективны ли созданные нами индексы, и является важным инструментом для анализа производительности запросов.

К распространённым функциям, используемым при анализе запросов MongoDB, относятся: explain() и hint().


Использование explain()

Операция explain предоставляет информацию о запросе, использовании индексов и статистику запросов и т. д. Она помогает нам оптимизировать индексы.

Далее мы создаём индексы по gender и user_name в коллекции users:

>db.users.ensureIndex({gender:1,user_name:1})

Теперь используем explain в операторе запроса:

>db.users.find({gender:"M"},{user_name:1,_id:0}).explain()

Приведённый выше запрос explain() возвращает следующие результаты:

{
   "cursor" : "BtreeCursor gender_1_user_name_1",
   "isMultiKey" : false,
   "n" : 1,
   "nscannedObjects" : 0,
   "nscanned" : 1,
   "nscannedObjectsAllPlans" : 0,
   "nscannedAllPlans" : 1,
   "scanAndOrder" : false,
   "indexOnly" : true,
   "nYields" : 0,
   "nChunkSkips" : 0,
   "millis" : 0,
   "indexBounds" : {
      "gender" : [
         [
            "M",
            "M"
         ]
      ],
      "user_name" : [
         [
            {
               "$minElement" : 1
            },
            {
               "$maxElement" : 1
            }
         ]
      ]
   }
}

Теперь давайте рассмотрим поля этого набора результатов:

  • indexOnly: Это поле равно true, что указывает на то, что мы использовали индекс.
  • cursor: Поскольку этот запрос использует индекс, а в MongoDB индексы хранятся в структуре B-дерева, он также использует курсор типа BtreeCursor. Если индекс не используется, тип курсора — BasicCursor. Этот ключ также содержит имя используемого вами индекса. По этому имени можно просмотреть коллекцию system.indexes в текущей базе данных (автоматически создаваемую системой для хранения информации об индексах, о которой кратко будет сказано позже), чтобы получить подробную информацию об индексе.
  • n: Количество документов, возвращённых текущим запросом.
  • nscanned/nscannedObjects: Показывает, сколько документов в коллекции было всего просканировано во время этого запроса. Наша цель — сделать это значение как можно более близким к количеству возвращённых документов.
  • millis: Время, необходимое для текущего запроса, в миллисекундах.
  • indexBounds: Конкретный индекс, используемый текущим запросом.

Использование hint()

Хотя оптимизатор запросов MongoDB обычно работает довольно хорошо, вы также можете использовать hint, чтобы заставить MongoDB использовать указанный индекс.

Этот метод может повысить производительность в некоторых ситуациях. Например, для индексированной коллекции и при выполнении запроса по нескольким полям (где некоторые поля уже проиндексированы).

Следующий пример запроса указывает использовать для запроса индексные поля gender и user_name:

>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1})

Вы можете использовать функцию explain() для анализа приведённого выше запроса:

>db.users.find({gender:"M"},{user_name:1,_id:0}).hint({gender:1,user_name:1}).explain()
Другие расширения