このセクションでは、Cloud Firestore Enterprise エディションのインデックス作成について説明します。 Cloud Firestore Enterprise エディションでは、デフォルトでインデックスは作成されません。データベースのパフォーマンスを向上させるには、最もよく使用されるクエリのインデックスを作成します。
インデックスは、データベースのパフォーマンスに大きな影響を与えます。クエリにインデックスが設定されている場合、スキャンする必要があるデータ量を減らし、結果の並べ替えに必要な作業を減らすことで、データベースから効率的に結果を返すことができます。ただし、インデックス エントリはストレージ コストと、インデックス付きフィールドに対する書き込みオペレーション中に実行される作業量を増やします。
エディション間の違い
次の表に、Cloud Firestore Standard エディションと Cloud Firestore Enterprise エディションのインデックス作成の主な違いの概要を示します。
| 機能 | Cloud Firestore Standard エディション | Cloud Firestore Enterprise エディション |
|---|---|---|
| インデックス作成の要件 | すべてのクエリの実行には、インデックスが必要です。通常、この要件によりクエリのパフォーマンスが向上します。 | クエリにインデックスは必要ありません。インデックスなしの読み取りが可能なため、プロトタイピングの障壁がありません。 |
| 自動インデックス | デフォルトでは、ドキュメント内のすべてのフィールドに対して単一フィールド インデックスが自動的に作成されます。 | 自動インデックスはありません。すべてのインデックスを手動で管理する必要があります。 |
| インデックス密度 | デフォルトではスパースです。コレクション グループ内のドキュメントがインデックスに登録されるのは、そのドキュメントにすべてのインデックス付きフィールドの値が含まれている場合に限ります。 | デフォルトでは非スパースです。コレクション グループ内のすべてのドキュメントがインデックスに登録されます。
値のないインデックス付きフィールドは NULL に設定されます。動作は、スパース インデックス オプションで変更できます。 |
| サポートされているインデックス タイプとオプション |
|
|
インデックスの定義と構造
インデックスは次の要素で構成されます。
- コレクション ID
- 指定されたコレクション内のフィールドのリスト
- 各フィールドの順序(昇順または降順)
インデックスでは、スパースまたは一意のオプションを有効にすることもできます。
インデックスの順序
インデックスは、各フィールドの順序と並べ替えの方向によって一意に定義されます。たとえば、次のインデックスは 2 つの異なるインデックスであり、互換性はありません。
| コレクション | フィールド |
|---|---|
| cities | country(昇順)、population(降順) |
| cities | population(降順)、country(昇順) |
クエリをサポートするインデックスを作成する場合は、クエリと同じ順序でフィールドを含めます。
インデックス密度
デフォルトでは、インデックス エントリにはコレクション内のすべてのドキュメントのデータが格納されます。これは、非スパース インデックスと呼ばれます。ドキュメントにインデックスで指定されたフィールドが含まれているかどうかに関係なく、ドキュメントのインデックス エントリが追加されます。 存在しないフィールドは、インデックス エントリの生成時に null 値を持つものとして扱われます。この動作を変更するには、インデックスをスパース インデックスとして定義します。
スパース インデックス
スパース インデックスは、インデックス付きフィールドの少なくとも 1 つに値(null を含む)を含んでいるコレクション内のドキュメントのみをインデックスに登録します。スパース インデックスにより、ストレージの費用を削減して、パフォーマンスを向上させることができます。
一意のインデックス
一意のインデックス オプションを設定して、インデックス付きフィールドに一意の値を適用します。 複数のフィールドにインデックスが設定されている場合、値の各組み合わせはインデックス全体で一意である必要があります。データベースは、重複する値のインデックス エントリを作成しようとする更新オペレーションや挿入オペレーションを拒否します。インデックス付きフィールドのデータに重複する値が含まれており、一意のインデックスを作成しようとすると、インデックスの構築が失敗し、オペレーションの詳細にエラー メッセージが表示されます。
一意のインデックス内の欠落しているフィールド
一意のインデックスに欠落しているフィールドがあるドキュメントを挿入すると、インデックスは欠落しているフィールドに null 値を設定します。生成されたインデックス エントリは一意である必要があります。一意でない場合、オペレーションは失敗します。
たとえば、次のインデックスがあるとします。
| コレクション | インデックス登録されるフィールド | クエリのスコープ |
|---|---|---|
| cities | 名前(昇順) | コレクション |
ドキュメント {"abbreviation": "LA"} をコレクションに追加すると、一意のインデックスによって name が null に設定されたエントリが作成されます。その後、ドキュメント {"abbreviation": "NYC"} を追加しようとすると、一意のインデックスの結果エントリが同じになるため、オペレーションは失敗します。
複数のフィールドを含む一意のインデックスに同じ動作が適用されます。ドキュメントを作成または更新するときに、インデックス付きフィールドが欠落している場合は null に設定され、結果のインデックス エントリはインデックス内で一意である必要があります。
インデックス構築エラーのトラブルシューティング
インデックスを管理するときに、インデックス構築エラーが発生することがあります。データベースがデータで問題を検出すると、インデックス作成オペレーションに失敗する可能性があります。 インデックス作成オペレーションは、次の理由で失敗することがあります。
- インデックスの上限に達しました。たとえば、オペレーションでドキュメントあたりの最大インデックス エントリ数に達した可能性があります。インデックスの作成に失敗すると、エラー メッセージが表示されます。インデックスの上限に達していない場合は、インデックス オペレーションを再試行します。
- 一意のインデックス オプションを設定しており、インデックス付きフィールドのデータで重複するインデックス エントリが作成されます。続行するには、重複する値の組み合わせをデータから削除します。
次のステップ
インデックスの作成と管理の方法を確認する。