Относится только к версии 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
, и результирующая запись индекса должна быть уникальной.
Устранение ошибок построения индекса
При управлении индексами могут возникнуть ошибки построения индекса. Операция индексирования может завершиться неудачей, если база данных обнаружит проблему с данными. Сбой индексирования может произойти по следующим причинам:
- Вы достигли лимита индекса. Например, операция могла достичь максимального количества записей индекса на документ. Если создание индекса не удалось, вы увидите сообщение об ошибке. Если лимит индекса не достигнут, повторите операцию индексирования.
- Требуется многоключевой индекс. Как минимум одно из индексированных полей содержит значение массива. Для продолжения необходимо либо использовать многоключевой индекс, либо удалить значения массива.
- Операция пытается индексировать несколько полей со значениями массива. В индексе с несколькими ключами не может быть более одного поля со значением массива. Чтобы продолжить, измените модель данных или определения индекса.
- Вы установили опцию уникального индекса, и данные индексированных полей создадут дублирующиеся записи индекса. Чтобы продолжить, удалите дублирующиеся комбинации значений из данных.
Что дальше?
- Узнайте, как создавать и управлять индексами