#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 должен проверять другое значение.