インデックスの概要

このページでは、MongoDB 互換の Firestore のインデックスについて説明します。MongoDB 互換の Firestore では、デフォルトでインデックスは作成されません。データベースのパフォーマンスを向上させるには、最も頻繁に使用されるクエリにインデックスを作成します。

インデックスはデータベースのパフォーマンスに大きな影響を与えます。クエリのインデックスが存在する場合、データベースはスキャンする必要があるデータの量を減らし、結果の並べ替えに必要な作業を減らすことで、結果を効率的に返すことができます。ただし、インデックス エントリを使用すると、ストレージ コストが増加し、インデックスに登録されたフィールドに対する書き込みオペレーションの処理量が増加します。

インデックスの定義と構造

インデックスは次の要素で構成されます。

  • コレクション ID
  • 指定したコレクション内のフィールドのリスト
  • 各フィールドの順序(昇順または降順)

インデックスでは、スパース オプションとマルチキー オプションを有効にすることもできます。

インデックスの順序付け

各フィールドの順序と並べ替え方向によって、インデックスが一意に定義されます。たとえば、次のインデックスは 2 つの異なるインデックスであり、互換性がありません。

コレクション フィールド
cities 国(昇順)、人口(降順)
cities 人口(降順)、国(昇順)、

クエリをサポートするインデックスを作成する場合は、クエリと同じ順序でフィールドを含めます。

インデックス密度

デフォルトでは、インデックス エントリにはコレクション内のすべてのドキュメントのデータが格納されます。これは非スパース インデックスと呼ばれます。ドキュメントにインデックスで指定されたフィールドが含まれているかどうかにかかわらず、ドキュメントにインデックス エントリが追加されます。インデックス エントリの生成時に、存在しないフィールドは NULL 値を持つものとして扱われます。この動作を変更するには、インデックスをスパース インデックスとして定義します。

スパース インデックス

スパース インデックスは、インデックスに登録されたフィールドの少なくとも 1 つに値(null を含む)が含まれているコレクション内のドキュメントのみをインデックスに登録します。スパース インデックスを使用すると、ストレージ コストが削減され、パフォーマンスが向上する場合があります。

配列値のマルチキー インデックス

配列値を含むフィールドにインデックスを作成する場合は、マルチキー インデックスを作成する必要があります。通常のインデックスでは、配列値にインデックスを付けることはできません。マルチキー インデックスは、インデックス定義で最大 1 つの配列フィールドをサポートし、配列値を走査するオペレーションに使用できます。

マルチキー インデックスは、配列値のインデックス化が必要であることを確認した場合にのみ使用してください。通常のインデックスには、クエリの処理時にメリットがあります。たとえば、通常のインデックスでは、範囲内の値をより効率的にフィルタできます。

配列値とマルチキー インデックスを操作する際に、次の状況でエラーが発生します。

  • オペレーションで、通常のインデックスでインデックス付けされたフィールドに配列値を追加しようとしています。配列値を追加するには、そのフィールドの既存の通常のインデックスを削除し、マルチキー インデックスとして再作成する必要があります。
  • 配列値を含むフィールドに通常インデックスを作成しようとしています。マルチキー インデックスを作成するか、配列値を削除する必要があります。
  • オペレーションで、配列値を持つ複数のフィールドのインデックス作成が試行されます。マルチキー インデックスに配列値を持つ複数のフィールドを含めることはできません。続行するには、データモデルまたはインデックスの定義を変更します。
  • 2 つのフィールドパスが users.postsusers.zip などの共通の接頭辞を共有するマルチキー インデックスを作成しようとしている。

インデックス構築エラーのトラブルシューティング

インデックスを管理するときに、インデックス構築エラーが発生することがあります。データベースでデータに関する問題が発生すると、インデックス作成オペレーションが失敗する可能性があります。インデックス作成オペレーションが失敗する理由は次のとおりです。

  • インデックスの上限に達しました。たとえば、オペレーションでドキュメントあたりの最大インデックス エントリ数に達した可能性があります。インデックスの作成に失敗すると、エラー メッセージが表示されます。インデックスの上限に達していない場合は、インデックス オペレーションを再試行します。
  • マルチキー インデックスが必要です。インデックス登録されたフィールドの少なくとも 1 つに配列値が含まれている。続行するには、マルチキー インデックスを使用するか、配列値を削除する必要があります。
  • オペレーションで、配列値を持つ複数のフィールドのインデックス作成が試行されます。マルチキー インデックスに配列値を持つ複数のフィールドを含めることはできません。続行するには、データモデルまたはインデックスの定義を変更します。

次のステップ