Да.Индекс все равно поможет, если вы ищете одно поле.Они полезны для поиска в одном поле, а не только для сложного поиска.
Если вы хотите избежать создания индекса, а ваш username
уникален, вы можете использовать имя пользователя в качестве свойства _id
.Если вы подумаете об этом, обязательно ознакомьтесь с разделами и распределением ключей.
Чтобы повысить производительность, прочитайте эту информацию в Covered Query, что требует, чтобы все извлекаемые поля также были проиндексированы.Это объясняется в следующих документах MongoDB:
Покрываемый запрос
Покрываемый запрос - это запрос, который может быть полностью выполнен с использованием индекса и не долженизучить любые документы.Индекс охватывает запрос, когда применяются оба следующих условия:
- все поля в запросе являются частью индекса, а
- все поля, возвращаемые в результатах, находятся втот же индекс.
Производительность
Поскольку индекс содержит все поля, необходимые для запроса, MongoDB может как соответствовать условиям запроса, так и возвращать результаты, используя толькоindex.
Запрашивать только индекс можно гораздо быстрее, чем запрашивать документы вне индекса.Индексные ключи обычно меньше, чем документы, которые они каталогизируют, и индексы обычно доступны в ОЗУ или расположены последовательно на диске.
Следует отметить, что если вы просто хотите проверить, существует ли запись, find().limit(1)
значительно быстрее, чем findOne
, поскольку find().limit(1)
возвращает курсор, а findOne()
будет читать документ, возвращать его вам и закрывать курсор, еслизапись существует.При использовании find().limit(1)
запрос не выполняется, поэтому вам понадобится другое действие для запуска запроса, например size()
или count(true)
.
Вот некоторая информация от инженера MongoDB:
Два выполняемых вами запроса очень разные.Запрос на поиск возвращает курсор, это по сути сценарий без операций, так как никакие фактические данные не возвращаются (только информация о курсоре).Если вы вызываете findOne, то вы фактически возвращаете данные и закрываете курсор.Документы, безусловно, должны быть более четкими: -)
Некоторая дополнительная информация с обсуждением этих запросов: