Обзор индексов

Это относится только к версии Cloud Firestore Enterprise.

На этой странице описывается индексирование для Cloud Firestore с поддержкой MongoDB. Cloud Firestore с поддержкой MongoDB по умолчанию не создает индексы. Для повышения производительности базы данных создайте индексы для наиболее часто используемых запросов.

Индексы оказывают значительное влияние на производительность базы данных. Если для запроса существует индекс, база данных может эффективно возвращать результаты, уменьшая объем данных, которые необходимо сканировать, и сокращая объем работы, необходимой для сортировки результатов. Однако записи в индексе увеличивают затраты на хранение и объем работы, выполняемой при операции записи в индексированные поля.

Определение и структура индекса

Указатель состоит из следующих элементов:

  • идентификатор коллекции
  • список полей в заданной коллекции
  • порядок, восходящий или нисходящий, для каждого поля

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

Упорядочение по индексу

Порядок и направление сортировки каждого поля однозначно определяют индекс. Например, следующие индексы являются двумя различными индексами и не взаимозаменяемы:

Коллекция Поля
города страна (по возрастанию), население (по убыванию)
города население (в порядке убывания), страна (в порядке возрастания),

При создании индекса для поддержки запроса включайте поля в том же порядке, что и в вашем запросе.

Плотность индекса

По умолчанию записи индекса хранят данные из всех документов в коллекции. Это называется неразреженным индексом. Запись индекса будет добавлена ​​для документа независимо от того, содержит ли документ какие-либо поля, указанные в индексе. Несуществующие поля рассматриваются как имеющие значение NULL при создании записей индекса. Чтобы изменить это поведение, вы можете определить индекс как разреженный.

Разреженные индексы

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

Многоключевые индексы для значений массива

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

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

При работе со значениями массивов и многоключевыми индексами возникают ошибки в следующих ситуациях:

  • Операция пытается добавить значение массива к полю, индексированному обычным индексом. Для добавления значения массива необходимо удалить существующие обычные индексы для этого поля и создать их заново как многоключевые индексы.
  • Вы пытаетесь создать обычный индекс для поля, содержащего значение массива. Вам необходимо либо создать многоключевой индекс, либо удалить значения массива.
  • Операция пытается проиндексировать несколько полей, содержащих значения массивов. В многоключевом индексе не может быть более одного поля со значением массива. Для продолжения измените свою модель данных или определения индексов.
  • Вы пытаетесь создать многоключевой индекс, в котором два пути к полям имеют общий префикс, например, users.posts и users.zip .

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

Установите параметр уникального индекса, чтобы обеспечить уникальность значений для индексируемых полей. Для индексов по нескольким полям каждая комбинация значений должна быть уникальной во всем индексе. База данных отклоняет любые операции обновления и вставки, которые пытаются создать записи индекса с повторяющимися значениями. Если данные индексируемых полей содержат повторяющиеся значения, и вы пытаетесь создать уникальный индекс, то построение индекса завершается с ошибкой в ​​подробностях операции.

Отсутствующие поля в уникальном индексе

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

Например, с помощью этого индекса:

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

Если добавить документ {"abbreviation": "LA"} в коллекцию, уникальный индекс создаст запись с name , установленным в null . Если затем попытаться добавить документ {"abbreviation": "NYC"} , операция завершится неудачей, поскольку результирующая запись для уникального индекса будет той же самой.

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

Устранение ошибок при построении индекса

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

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

Что дальше?