Индекс MongoDB

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

Эффективность этого запроса сканирования всей коллекции очень низка, особенно при обработке больших объёмов данных. Такой запрос может выполняться десятки секунд или даже минуты, что губительно для производительности веб-сайта.

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

В MongoDB распространённые типы индексов включают:

  • Индекс по одному полю: индекс, основанный на одном поле.
  • Составной индекс: индекс, основанный на комбинации нескольких полей.
  • Текстовый индекс: используется для поддержки полнотекстового поиска.
  • Геопространственный индекс: используется для запросов к геопространственным данным.
  • Хеш-индекс: индекс, который выполняет хеширование значений полей.

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

MongoDB использует метод createIndex() для создания индексов.

Обратите внимание, что до версии 3.0.0 метод создания индексов назывался db.collection.ensureIndex(). В более поздних версиях используется метод db.collection.createIndex(). ensureIndex() всё ещё работает, но это лишь псевдоним createIndex().

Синтаксис

Базовый формат синтаксиса метода createIndex() выглядит следующим образом:

db.collection.createIndex( keys, options )
  • db: Ссылка на базу данных.
  • collection: Имя коллекции.
  • keys: Объект, который задаёт имя поля и порядок сортировки индекса (1 означает по возрастанию, -1 — по убыванию).
  • options: Необязательный параметр, который может содержать дополнительные опции для индекса.

Параметр options — это объект, который может содержать несколько параметров конфигурации. Ниже приведены некоторые часто используемые опции:

  • unique: Если задано значениеtrue, создаётся уникальный индекс, гарантирующий, что значения поля индекса уникальны в коллекции.
  • background: Если задано значениеtrue, процесс создания индекса выполняется в фоновом режиме, не влияя на другие операции с базой данных.
  • name: Задаёт имя индекса. Если не указано, MongoDB автоматически сгенерирует имя на основе полей индекса.
  • sparse: Если задано значениеtrue, создаётся разреженный индекс, который индексирует только документы, содержащие поле индекса.
  • expireAfterSeconds: Задаёт время истечения срока действия поля индекса; MongoDB автоматически удалит просроченные документы.
  • v: Версия индекса, обычно не требуется задавать её вручную.
  • weights: Задает веса для текстового индекса.

Пример

// Создать индекс по возрастанию для поля age
db.myCollection.createIndex({ age: 1 });
// Создать текстовый индекс для поля name
db.myCollection.createIndex({ name: "text" });

Пример

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

Пример

// Создать уникальный индекс
db.collection.createIndex( { field: 1 }, { unique: истина } )

// Создать индекс в фоновом режиме
db.collection.createIndex( { field: 1 }, { background: истина } )

// Создать разреженный индекс
db.collection.createIndex( { field: 1 }, { sparse: истина } )

// Создать текстовый индекс и указать веса
db.collection.createIndex( { field: "text" }, { weights: { field: 10 } } )
Создание геопространственного индекса
Для полей, в которых хранятся данные о географическом местоположении, можно использовать типы индексов 2dsphere или 2d для создания геопространственных индексов.

// индекс 2dsphere, подходит для сферических географических данных
db.collection.createIndex( { location: "2dsphere" } )

// индекс 2d, подходит для плоских географических данных
db.collection.createIndex( { location: "2d" } )

Создание хэш-индекса

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

db.collection.createIndex( { field: "hashed" } )

Просмотр индекса

Используйте метод getIndexes() для просмотра всех индексов в коллекции:

db.collection.getIndexes()

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

Используйте методы dropIndex() или dropIndexes() для удаления индексов:

Пример

// Удалить указанный индекс
db.collection.dropIndex( "indexName" )

// Удалить все индексы
db.collection.dropIndexes()

Стратегия индексов

При создании индексов необходимо учитывать следующие факторы:

  • Частота запросов: Полям, которые часто используются для запросов, следует отдавать приоритет.
  • Кардинальность поля: Чем выше кардинальность значений поля (т. е. чем больше уникальных значений), тем лучше эффект индекса.
  • Размер индекса: Размер индекса влияет на использование памяти базой данных и производительность запросов.

Оптимизация индексов

При оптимизации индексов можно рассмотреть следующие методы:

  • Выберите подходящий тип индекса: Выберите подходящий тип индекса в зависимости от требований запроса.
  • Создавайте составные индексы: Для полей, которые часто используются вместе, рассмотрите создание составного индекса для повышения эффективности запросов.
  • Следите за производительностью индексов: Регулярно отслеживайте использование индексов и корректируйте индексы в соответствии с фактическими потребностями.

Примечания

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

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

Другие расширения