MongoDB - полезен ли индекс для коллекции, в которой будет только запрос findOne? - PullRequest
0 голосов
/ 11 июня 2018

Не удалось найти хороший ответ на мой вопрос. Как вы думаете, индекс для коллекции, которая будет выполнять только запрос findOne, поможет повысить производительность?Я понимаю, что индекс используется, чтобы избежать сканирования всей коллекции при выполнении запроса поиска.Однако в запросе findOne обеспечивает ли индекс какую-либо выгоду?

Например, в коллекции пользователей предположим, что в ней есть только одно поле - username.Индекс по имени пользователя улучшается db.users.findOne({username: 'johndoe'})?

1 Ответ

0 голосов
/ 11 июня 2018

Да.Индекс все равно поможет, если вы ищете одно поле.Они полезны для поиска в одном поле, а не только для сложного поиска.

Если вы хотите избежать создания индекса, а ваш username уникален, вы можете использовать имя пользователя в качестве свойства _id.Если вы подумаете об этом, обязательно ознакомьтесь с разделами и распределением ключей.

Чтобы повысить производительность, прочитайте эту информацию в Covered Query, что требует, чтобы все извлекаемые поля также были проиндексированы.Это объясняется в следующих документах MongoDB:

Покрываемый запрос

Покрываемый запрос - это запрос, который может быть полностью выполнен с использованием индекса и не долженизучить любые документы.Индекс охватывает запрос, когда применяются оба следующих условия:

  • все поля в запросе являются частью индекса, а
  • все поля, возвращаемые в результатах, находятся втот же индекс.

Производительность

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

Запрашивать только индекс можно гораздо быстрее, чем запрашивать документы вне индекса.Индексные ключи обычно меньше, чем документы, которые они каталогизируют, и индексы обычно доступны в ОЗУ или расположены последовательно на диске.

Следует отметить, что если вы просто хотите проверить, существует ли запись, find().limit(1) значительно быстрее, чем findOne, поскольку find().limit(1) возвращает курсор, а findOne() будет читать документ, возвращать его вам и закрывать курсор, еслизапись существует.При использовании find().limit(1) запрос не выполняется, поэтому вам понадобится другое действие для запуска запроса, например size() или count(true).

Вот некоторая информация от инженера MongoDB:

Два выполняемых вами запроса очень разные.Запрос на поиск возвращает курсор, это по сути сценарий без операций, так как никакие фактические данные не возвращаются (только информация о курсоре).Если вы вызываете findOne, то вы фактически возвращаете данные и закрываете курсор.Документы, безусловно, должны быть более четкими: -)

Некоторая дополнительная информация с обсуждением этих запросов:

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