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