Cloud Firestore は、すべてのクエリにインデックスを要求することで、クエリのパフォーマンスを保証します。最も基本的なクエリに必要なインデックスは、自動的に作成されます。アプリを使用してテストすると、アプリに必要な追加のインデックスを作成するのに役立つエラー メッセージが Cloud Firestore によって生成されます。このページでは、単一フィールドインデックスと複合インデックスを管理する方法について説明します。
エラー メッセージから不足しているインデックスを作成する
既存のインデックスにマップされていない範囲句を使用して複合クエリを実行しようとすると、エラーが発生します。エラー メッセージには、Firebase コンソールで不足しているインデックスを作成するための直接リンクが含まれています。
生成された Firebase コンソールへのリンクをたどり、自動的に入力された情報を確認して、 [作成] をクリックします。
Firebase コンソールを使用する
Firebase コンソールから新しいインデックスを手動で作成するには:
- Firebase コンソールのCloud Firestoreセクションに移動します。
- [インデックス] タブに移動し、[インデックスの追加] をクリックします。
- コレクション名を入力し、インデックスを並べ替えるフィールドを設定します。
- [作成]をクリックします。
クエリのサイズによっては、インデックスの作成に数分かかる場合があります。インデックスを作成すると、複合インデックス セクションでインデックスとそのステータスを確認できます。まだビルド中の場合は、Firebase コンソールにビルド ステータス バーが表示されます。
インデックスを削除
索引を削除するには:
- Firebase コンソールのCloud Firestoreセクションに移動します。
- [インデックス] タブをクリックします。
- 削除するインデックスにカーソルを合わせ、コンテキスト メニューから [削除]を選択します。
- アラートから [削除]をクリックして、削除することを確認します。
Firebase CLI を使用する
Firebase CLIを使用してインデックスをデプロイすることもできます。開始するには、プロジェクト ディレクトリでfirebase init firestore
を実行します。セットアップ中に、Firebase CLI は正しい形式のデフォルト インデックスを含む JSON ファイルを生成します。ファイルを編集してインデックスを追加し、 firebase deploy
コマンドでデプロイします。インデックスのみをデプロイする場合は、 --only firestore:indexes
フラグを追加します。 Firebase コンソールを使用してインデックスを編集する場合は、必ずローカル インデックス ファイルも更新してください。 JSON インデックス定義リファレンスを参照してください。
索引作成時間
インデックスを作成するには、Cloud Firestore でインデックスを設定してから、インデックスに既存のデータをバックフィルする必要があります。インデックスの構築時間は、セットアップ時間とバックフィル時間の合計です。
インデックスの設定には数分かかります。空のデータベースであっても、インデックスの最小構築時間は数分です。
バックフィル時間は、新しいインデックスに属する既存のデータの量によって異なります。インデックス定義に一致するフィールド値が多いほど、インデックスのバックフィルにかかる時間が長くなります。
インデックスの作成は長時間実行される操作です。
インデックスの構築を開始すると、Cloud Firestore はオペレーションに一意の名前を割り当てます。オペレーション名には、 projects/[PROJECT_ID]/databases/(default)/operations/
というプレフィックスが付きます。次に例を示します。
projects/project-id/databases/(default)/operations/ASA1MTAwNDQxNAgadGx1YWZlZAcSeWx0aGdpbi1zYm9qLW5pbWRhEgopEg
ただし、 describe
コマンドのオペレーション名を指定するときは、プレフィックスを省略できます。
すべての長時間実行オペレーションの一覧表示
長時間実行オペレーションを一覧表示するには、 gcloud firestore operations listコマンドを使用します。このコマンドは、進行中の操作と最近完了した操作を一覧表示します。操作は、完了後数日間表示されます。
gcloud firestore operations list
稼働状況を確認する
すべての長時間実行オペレーションをリストする代わりに、1 つのオペレーションの詳細をリストできます。
gcloud firestore operations describe operation-name
完了時間の見積もり
操作の実行中、操作の全体的なステータスについてはstate
フィールドの値を参照してください。
長時間実行オペレーションのステータスをリクエストすると、メトリクスworkEstimated
およびworkCompleted
も返されます。これらのメトリックは、ドキュメントの数に対して返されます。 workEstimated
は、オペレーションが処理するドキュメントの推定総数を示します。 workCompleted
は、これまでに処理されたドキュメントの数を示します。操作が完了すると、 workCompleted
は実際に処理されたドキュメントの総数を反映します。これは、 workEstimated
の値とは異なる場合があります。
作業を分割するworkCompleted
の進捗見積もりのworkEstimated
で完了します。統計収集の遅延に依存するため、見積もりが不正確になる可能性があります。
たとえば、インデックス作成の進行状況は次のとおりです。
{ "operations": [ { "name": "projects/project-id/operations/AyAyMDBiM2U5NTgwZDAtZGIyYi0zYjc0LTIzYWEtZjg1ZGdWFmZWQHEjF0c2Flc3UtcmV4ZWRuaS1uaW1kYRUKSBI", "metadata": { "@type": "type.googleapis.com/google.firestore.admin.v1.IndexOperationMetadata", "common": { "operationType": "CREATE_INDEX", "startTime": "2020-06-23T16:52:25.697539Z", "state": "PROCESSING" }, "progressDocuments": { "workCompleted": "219327", "workEstimated": "2198182" } }, }, ...
操作が完了すると、操作の説明に"done": true
が含まれます。操作の結果については、 state
フィールドの値を参照してください。応答でdone
フィールドが設定されていない場合、その値はfalse
です。進行中の操作のdone
値の存在に依存しないでください。
インデックス構築エラー
複合インデックスおよび単一フィールド インデックスの除外を管理しているときに、インデックス作成エラーが発生する場合があります。 Cloud Firestore がインデックスを作成しているデータに問題が発生した場合、インデックス作成操作は失敗する可能性があります。ほとんどの場合、これはインデックス制限に達したことを意味します。たとえば、操作がドキュメントあたりのインデックス エントリの最大数に達した可能性があります。
インデックスの作成に失敗すると、コンソールにエラー メッセージが表示されます。インデックスの制限に達していないことを確認したら、インデックス操作を再試行してください。