Запросы mongo find выполняются быстрее с большим количеством критериев?

#performance #mongodb #optimization #mongodb-query #query-performance

#Производительность #mongodb #оптимизация #mongodb-запрос #запрос-производительность

Вопрос:

Улучшается ли производительность за счет ограничения поиска (или findOne) с помощью большего количества критериев?

Пример:

 db.users.find({_id : ObjectId("111111111111111111111111")})

db.users.find({_id : ObjectId("111111111111111111111111"), accountId : ObjectId("22222222222222222222222")})
 

Другой пример:

 db.users.find({full_name: 'Lionel Messi'})

db.users.find({full_name : 'Lionel Messi', first_name : 'Lionel', last_name : 'Messi' })
 

Ответ №1:

Как правило, нет. Поскольку MongoDB имеет тенденцию возвращать курсор первых N найденных значений, если быть более точным, поиск значений, соответствующих этим критериям, займет больше времени.

Если вы хотите увидеть, что может повлиять на скорость вашего запроса, рекомендуется использовать этот explain() метод.

Смотрите Здесь для получения более подробной информации: http://docs.mongodb.org/manual/tutorial/analyze-query-plan /

Ответ №2:

Нет, поскольку вы используете _id which является уникальным.

Что касается замедления запроса: он может быть медленнее максимум на наносекунды, если нет составного индекса {_id, accountId} , поскольку после того, как документы по _id индексу будут найдены, они будут загружены в память в соответствии с accountId полем.

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

Однако, поскольку ваш запрос (будучи раскрытым) в любом случае загрузит документ до возврата, единственное, что замедляет выполнение запроса, — это окончательное совпадение, которое в принципе незначительно по скорости.

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

1. Понятно. Добавлен второй пример. Также интересно узнать о неуникальных случаях _id.

2. @Chandrew в этом случае: действительно, если запрос попадет в составной индекс, i5t будет быстрее, чем нет, и только поиск по full_name из-за экономии времени загружает результаты кратных документов

Ответ №3:

В данном случае нет. _id индексируется автоматически и однозначно идентифицирует документы. Первый критерий

 {_id : ObjectId("111111111111111111111111")}
 

найдет документ, используя индекс. Проверка значения accountId на самом деле сделает запрос медленнее, потому что MongoDB должен проверять другое значение.