インデックス キーのヒートマップ パターン

このページでは、Key Visualizer ヒートマップでみられるパターンの例を示します。これらのパターンは、特定のパフォーマンスの問題のトラブルシューティングに役立ちます。

均等に分散された使用

読み取りと書き込みが均等に分布しているヒートマップ

ヒートマップで明るい色と暗い色がきめ細かく混在している場合、インデックス キーに対する書き込み/削除オペレーションがデータベース全体で均等に行われています。このヒートマップは、Firestore の効果的な使用パターンを表しています。

シーケンシャル キーのインデックス

単一の明るい斜線が書かれたヒートマップは、タイムスタンプなど、厳密に増加または減少しているキーにあるインデックスを示しています。シーケンシャル キーのインデックスは推奨されず、ホットスポットが作成される可能性があります。ホットスポット化を使用している場合、対応するレイテンシの増加が見られる場合があります。

インデックスに共通するホットスポットの例の一部を次に示します。

タイムスタンプ増加によるホットスポット化

タイムスタンプの増加によるホットスポット化を示すヒートマップ

この例で、単一の明るい斜線が書かれたヒートマップは、タイムスタンプ フィールド名に対するインデックスの書き込み/削除オペレーションを厳密に増減しているデータベースを示しています。

フィールド名の増加によるホットスポット化

フィールドの増加によるホットスポット化を示すヒートマップ

この例で、単一の明るい斜線が書かれたヒートマップは、自動生成の請求書番号など、増分フィールドに対してインデックスの書き込み/削除オペレーションの増減を厳密に使用しているデータベースを示すことができます。

ホットスポット化の問題を特定するには、Key Visualizer ツールとインデックス キーの構造を理解して、どのインデックスが問題の原因となっているかを判断し、ベスト プラクティスでそれらのインデックスを除外します。

インデックス キーの構造について

Key Visualizer ツールに表示されるインデックス キーの構造を理解する前に、Firestore のインデックスについて学習します。

次のコードは、ヒートマップ上の影響を受けるキー範囲にカーソルを合わせると表示されるインデックス キーの形式の例を示しています。

COLLECTION: projects/PROJECT_ID/databases/(default)/documents/Users
  PROPERTIES: (Timestamp: DESC) 
  VALUES: (16500000000000001)
  DOCUMENT: projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001

ここで

  • COLLECTION: データベース内のコレクションの場所。スコープに基づいて、コレクションのスコープのコレクション パス、またはコレクション グループのスコープのコレクション名を指定できます。
  • プロパティ: インデックスの作成に使用されるフィールド。__name__ 順序指定プロパティは、デフォルトの順序を変更するインデックス定義に対してのみ表示されます。
  • VALUES: 各プロパティの値。
  • DOCUMENT: オペレーションで更新されたドキュメントの ID。

前の例から、PROPERTIES 値からフィールドを特定して、影響を受けるインデックスを見つけます。

インデックスを見つけるには、次の手順を完了します。

  1. Google Cloud コンソールで [Database] ページに移動します。

    [データベース] に移動

  2. データベースのリストから、必要なデータベースを選択します。

  3. ナビゲーション メニューで、[インデックス] をクリックします。

  4. [複合] または [単一フィールド] タブに移動します。

    インデックスの種類は、[PROPERTIES] フィールドを分析することで特定できます。詳細については、インデックス キーの例をご覧ください。

  5. [フィルタ] をクリックし、[フィールド] を選択して、フィールド名を入力します。

    複合インデックスの場合は、OR 演算子を使用してフィールドを追加します。

問題の原因となっているインデックスを特定したら、次の解決策を使用できます。

  • 複合インデックス: 値が単調に増加または減少するフィールドがインデックス登録の最初のフィールドとして選択されないようにインデックスを変更するか、インデックスを削除します。

  • 単一フィールド インデックス: 除外するフィールドと並べ替え順序の除外を追加します。詳細については、単一フィールドの除外の追加をご覧ください。

ヒートマップのインデックス キーエントリの例

タイプ 説明
コレクション スコープの単一フィールド インデックス ASC、DESC Firestore はデフォルトで、スコープをコレクションに設定したインデックスを作成します。

Users/5000000000000001 ドキュメントの Timestamp フィールドの単一フィールド インデックスのインデックス エントリ(降順)。
COLLECTION: projects/PROJECT_ID/databases/(default)/documents/Users
PROPERTIES: (Timestamp: DESC)
VALUES: (16500000000000001)
DOCUMENT: projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001
配列フィールドのコレクション スコープの単一フィールド インデックス ドキュメント内の配列フィールドに対しては、Firestore はコレクションのスコープ配列の内容インデックスを作成、維持します。

配列の内容モードの単一フィールド インデックスのインデックス エントリで、フィールド Country: [USA, Japan] がドキュメントに追加されるときに作成されます。このフィールドには、ASC、DESC インデックスもデフォルトで作成されることに留意してください。例は、Country フィールドの ASC インデックスを示しています。
COLLECTION: projects/PROJECT_ID/databases/(default)/documents/Users
PROPERTIES:(Country: ASC)
VALUES:([USA, Japan]) DOCUMENT:(projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001)
コレクション グループの単一フィールド インデックス ASC、DESC、ARRAY コレクション グループには、同じコレクション ID を持つすべてのコレクションが含まれます。
Timestamp フィールドのコレクション グループの単一フィールド インデックスのインデックス エントリ(降順)。
COLLECTION GROUP: Users
PROPERTIES: (Timestamp: DESC)
VALUES: (16500000000000001L)
DOCUMENT: projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001
コレクション グループの単一フィールド インデックス ASC、DESC、ARRAY array-contains モードの Country フィールドのコレクション グループの単一フィールド インデックスのインデックス エントリ COLLECTION GROUP: Users PROPERTIES: (Country: ARRAY ASC) VALUES: (USA) DOCUMENT: projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001
ASC、ASC、ARRAY プロパティを持つコレクションの複合インデックス エントリ コレクション スコープ インデックス定義で、ネストされたドキュメントを作成すると、親を持つ複合インデックス エントリが作成されます。

TimestampName のフィールドを持つ複合インデックスのインデックス エントリ(昇順)、および Countryarray-contains モード)。
COLLECTION: projects/PROJECT_ID/databases/(default)/documents/Users
PROPERTIES: (Timestamp: ASC, Name: ASC,Country: ARRAY)
VALUES: (16500000000000001L, 'Alice', 'USA')
DOCUMENT: (projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001)
ASC、ASC プロパティを持つコレクション グループのスコープの複合インデックス エントリ Timestamp フィールド(昇順)と Name フィールド(昇順)の複合インデックスのインデックス エントリ COLLECTION GROUP: Users
PROPERTIES: (Timestamp: ASC, Name: ASC)
VALUES: (16500000000000001L, 'Alice')
DOCUMENT: (projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001)
ASC プロパティと __name__ プロパティを持つコレクション スコープの複合インデックス エントリ Timestamp フィールド(昇順)と Users/5000000000000001 ドキュメントに対する __name__ 並べ替えの(昇順)の複合インデックスのインデックス エントリ。インデックス定義の最後のフィールドとして __name__ を使用すると、結果のデフォルトの順序を変更できます。 COLLECTION: projects/PROJECT_ID/databases/(default)/documents/Users
PROPERTIES: (Timestamp: ASC, __name__ DESC)
VALUES: (16500000000000001)
DOCUMENT: projects/PROJECT_ID/databases/(default)/documents/Users/5000000000000001

次のステップ