В этом разделе описывается индексирование для Cloud Firestore Enterprise Edition. Cloud Firestore Enterprise Edition по умолчанию не создает индексы. Для повышения производительности базы данных создайте индексы для наиболее часто используемых запросов.
Индексы оказывают значительное влияние на производительность базы данных. Если для запроса существует индекс, база данных может эффективно возвращать результаты, уменьшая объем данных, которые необходимо сканировать, и сокращая объем работы, необходимой для сортировки результатов. Однако записи в индексе увеличивают затраты на хранение и объем работы, выполняемой при операции записи в индексированные поля.
Различия между изданиями
В таблице ниже представлен обзор основных различий в индексировании между версиями Cloud Firestore Standard и Cloud Firestore Enterprise.
| Особенность | Cloud Firestore Standard edition | Cloud Firestore Enterprise edition |
|---|---|---|
| Требования к индексации | Для выполнения всех запросов необходимы индексы. Как правило, благодаря этому требованию запросы отличаются высокой производительностью. | Индексирование для запросов не требуется. Возможно чтение без индексов, что устраняет препятствие для прототипирования. |
| Автоматическое индексирование | По умолчанию для всех полей в документах автоматически создаются однопольные индексы. | Автоматическое создание индексов отсутствует. Все индексы необходимо управлять вручную. |
| Плотность индекса | По умолчанию используется разреженный режим индексации. Документ в группе коллекций индексируется только в том случае, если он содержит значение для каждого индексируемого поля. | По умолчанию используется неразреженный индекс. Индексируются все документы в группе коллекций. Индексированные поля без значения устанавливаются в NULL . Поведение можно изменить с помощью параметра разреженного индекса. |
| Поддерживаемые типы индексов и параметры |
|
|
Определение и структура индекса
Указатель состоит из следующих элементов:
- идентификатор коллекции
- список полей в заданной коллекции
- порядок, восходящий или нисходящий, для каждого поля
Индекс также может включать в себя разреженные или уникальные варианты.
Упорядочение по индексу
Порядок и направление сортировки каждого поля однозначно определяют индекс. Например, следующие индексы являются двумя различными индексами и не взаимозаменяемы:
| Коллекция | Поля |
|---|---|
| города | страна (по возрастанию), население (по убыванию) |
| города | население (в порядке убывания), страна (в порядке возрастания), |
При создании индекса для поддержки запроса включайте поля в том же порядке, что и в вашем запросе.
Плотность индекса
По умолчанию записи индекса хранят данные из всех документов в коллекции. Это называется неразреженным индексом. Запись индекса будет добавлена для документа независимо от того, содержит ли документ какие-либо поля, указанные в индексе. Несуществующие поля рассматриваются как имеющие значение NULL при создании записей индекса. Чтобы изменить это поведение, вы можете определить индекс как разреженный.
Разреженные индексы
Разреженный индекс индексирует только те документы в коллекции, которые содержат значение (включая NULL) хотя бы для одного из индексируемых полей. Разреженный индекс снижает затраты на хранение и может повысить производительность.
Уникальные индексы
Установите параметр уникального индекса, чтобы обеспечить уникальность значений для индексируемых полей. Для индексов по нескольким полям каждая комбинация значений должна быть уникальной во всем индексе. База данных отклоняет любые операции обновления и вставки, которые пытаются создать записи индекса с повторяющимися значениями. Если данные индексируемых полей содержат повторяющиеся значения, и вы пытаетесь создать уникальный индекс, то построение индекса завершается с ошибкой в подробностях операции.
Отсутствующие поля в уникальном индексе
Если вы вставляете документ с отсутствующими полями для уникального индекса, индекс устанавливает null значения для отсутствующих полей. Результирующая запись в индексе должна быть уникальной, иначе операция завершится неудачей.
Например, с помощью этого индекса:
| Коллекция | Индексированные поля | Область запроса |
|---|---|---|
| города | имя (по возрастанию) | Коллекция |
Если добавить документ {"abbreviation": "LA"} в коллекцию, уникальный индекс создаст запись с name , установленным в null . Если затем попытаться добавить документ {"abbreviation": "NYC"} , операция завершится неудачей, поскольку результирующая запись для уникального индекса будет той же самой.
Аналогичное поведение применяется к уникальным индексам с несколькими полями. При создании или обновлении документа отсутствующие индексированные поля устанавливаются в null , и результирующая запись в индексе должна быть уникальной в индексе.
Устранение ошибок при построении индекса
При управлении индексами вы можете столкнуться с ошибками при их создании. Операция индексирования может завершиться неудачей, если база данных обнаружит проблему с данными. Операции индексирования могут завершиться неудачей по следующим причинам:
- Вы достигли лимита индекса. Например, возможно, операция достигла максимального количества записей индекса на документ. Если создание индекса не удалось, вы увидите сообщение об ошибке. Если лимит индекса не достигнут, повторите операцию индексирования.
- Вы задали параметр уникального индекса, и данные индексированных полей создадут повторяющиеся записи в индексе. Для продолжения удалите повторяющиеся комбинации значений из данных.
Что дальше?
Узнайте, как создавать и управлять индексами .