Индексы

Последнее обновление: 29.07.2022

При поиске документов в небольших коллекциях мы не испытаем особых проблем. Однако когда коллекции содержат миллионы документов, а нам надо сделать выборку по определенному полю, то поиск нужных данных может занять некоторое время, которое может оказаться критичным для нашей задачи. В этом случае нам могут помочь индексы.

Индексы позволяют упорядочить данные по определенному полю, что впоследствии ускорит поиск. Например, если мы в своем приложении или задаче, как правило, выполняем поиск по полю name, то мы можем индексировать коллекцию по этому полю.

Создание индекса

Для создания индекса применяется функция createIndex(), в которую передается объект с указанием полей, для которых создается индекс. Например, создание индекса по полю "name":

db.users.createIndex({"name" : 1})

При создании индекса консоль вернет нам название индекса:

test> db.users.createIndex({"name" : 1})
name_1
test>

То есть в примере выше был создани индекс с именем "name_1" по полю name. MongoDB позволяет установить до 64 индексов на одну коллекцию.

Для создания нескольких индексов применяется функция createIndexes() - в нее передается массив объектов, которые устанавливают поля для индексов:

db.users.createIndexes([{"name" : 1}, {"age": 1}])

В данном случае создаются два индекса - один для поля name, другой для поля age.

Удаление индексов

Для удаления индексов применяется функция dropIndex(), в которую передается имя индекса. Например, удалим выше определенный индекс "name_1":

db.users.dropIndex("name_1")

Настройка индексов

Если мы просто определим индекс для коллекции, например, db.users.createIndex({"name" : 1}), то мы все еще сможем добавлять в коллекцию документы с одинаковым значением ключа name. Однако, если нам потребуется, чтобы в коллекцию можно было добавлять документ с одним и тем же значением ключа только один раз, мы можем установить флаг unique:

db.users.createIndex({"name" : 1}, {"unique" : true})

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

Теперь, если мы попытаемся добавить в коллекцию два документа с одним и тем же значением name, то мы получим ошибку.

В тоже время тут есть свои тонкости. Так, документ может не иметь ключа name. В этом случае для добавляемого документа автоматически создается ключ name со значением null. Поэтому при добавлении второго документа, в котором не определен ключ name, будет выброшено исключение, так как ключ name со значением null уже присутствует в коллекции.

Также можно задать один индекс сразу для двух полей:

db.users.createIndex({"name" : 1, "age" : 1})

Однако в этом случае все добавляемые документы должны иметь уникальные значения для обоих полей.

Кроме того, тут есть свои ограничения. Например, значение поля, по которому идет индексация, не должно быть больше 1024 байт.

Управление индексами

Все индексы базы данных хранятся в системной коллекции indexes. Для обращения к ней мы можем использовать функцию getIndexes, например, чтобы вывести всю информацию об индексах для конкретной коллекции:

db.users.getIndexes()

Данная команда вернет вывод наподобие следующего:

test> db.users.getIndexes()
[
  { v: 2, key: { _id: 1 }, name: '_id_' },
  { v: 2, key: { name: 1 }, name: 'name_1' }
]
test>

Как мы видим, здесь для коллекции users (из бд test) определено 2 индекса: id и name. Поле key используется для поиска максимального и минимального значений, для различных операций, где надо применять данный индекс. Поле name применяется в качестве идентификатора для операций администрирования, например, для удаления индекса:

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850