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

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

均等に分散された使用

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

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

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

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

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

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

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

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

プロパティ名の増加によるホットスポット化

プロパティの増加によるホットスポット化を表すヒートマップ

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

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

インデックス キーの構造を理解する

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

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

NAMESPACE: NS KIND: Users
PROPERTIES: (Timestamp: DESC, Name: DESC)
ANCESTOR: KEY(PROJECT('PROJECT_ID'),NAMESPACE('NS'),`UserList`,1)
VALUES: (16500000000000001,'Alice')
ENTITY:KEY(PROJECT('PROJECT_ID'),NAMESPACE(''),`UserList`,1,`User`,5000000000000001)

ここで

  • NAMESPACE: エンティティの名前空間
  • KIND: エンティティを分類するエンティティの種類
  • PROPERTIES: エンティティに関連するプロパティ__key__ 順序指定プロパティは、デフォルトの順序を変更するインデックス定義に対してのみ表示されます。
  • ANCESTOR: オプションの祖先パス。データベース階層内のエンティティの位置を指定します。
  • VALUES: 各プロパティの値。
  • ENTITY: オペレーションで更新されたエンティティの ID。

前の例から、PROPERTIES 値からプロパティを特定して、影響を受けるインデックスを見つけます。

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

  1. Google Cloud コンソールで Datastore モードのインデックスのページに移動します。

    Datastore モードのインデックスに移動する

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

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

    複合インデックスの場合は、OR 演算子を使用してプロパティを追加します。

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

  • 組み込みインデックス: プロパティを除外して、インデックスがそのプロパティのインデックス エントリを保持しないようにします。詳しくは、除外されたプロパティをご覧ください。
  • 複合インデックス: index.yaml ファイルでインデックスを変更して、値が単調に増加または減少するフィールドをインデックス作成の最初のフィールドとして選択しないようにするか、インデックスを削除します。詳細については、index.yaml についてをご覧ください。

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

タイプ 説明
組み込みインデックス エントリ Timestamp プロパティの単一のプロパティ インデックスのインデックス エントリ(NS 名前空間の降順)。 NAMESPACE: NS
KIND: Users
PROPERTIES: (Timestamp: DESC)
ANCESTOR: NONE
VALUES: (16500000000000001)
ENTITY: KEY(PROJECT('PROJECT_ID'), NAMESPACE('NS'),Users, 5000000000000001)
組み込みインデックス エントリ デフォルトの名前空間内の単一プロパティ インデックスのインデックス エントリ。 NAMESPACE: ' '
KIND: Users
PROPERTIES: (Timestamp: DESC)
ANCESTOR: NONE
VALUES: (16500000000000001)
ENTITY: KEY(PROJECT('PROJECT_ID'), NAMESPACE('NS'),Users, 5000000000000001)
複合インデックス エントリ Timestamp プロパティと Name プロパティの複合インデックスのインデックス エントリ(祖先は有効にせず、降順)。 NAMESPACE: NS
KIND: Users
PROPERTIES: (Timestamp: DESC, Name: DESC)
ANCESTOR: NONE
VALUES: (16500000000000001, 'Alice')
ENTITY: KEY(PROJECT('PROJECT_ID'),NAMESPACE('NS'),Users,5000000000000001)
複合インデックス エントリ(祖先あり) Timestamp プロパティの複合インデックスのインデックス エントリと、Name プロパティ(祖先が有効で降順)。 NAMESPACE: NS
KIND: Users
PROPERTIES: (Timestamp: DESC, Name: ASC)
ANCESTOR: KEY(PROJECT('PROJECT_ID'),NAMESPACE('NS'),UserList,1,User,5000000000000001
VALUES: (16500000000000001, 'Alice')
ENTITY: KEY(PROJECT('PROJECT_ID'),NAMESPACE('NS'),UserList,1,User,5000000000000001)
__key__ を含む複合インデックス エントリ Timestamp プロパティの複合インデックスのインデックス エントリ(昇順)と __key__(祖先は有効にせず、降順)。インデックス定義の最後のプロパティとして __key__ を使用すると、結果のデフォルトの順序を変更できます。 NAMESPACE: NS
KIND: Users
PROPERTIES: (Timestamp: ASC, __key__ DESC)
ANCESTOR: NONE
VALUES: (16500000000000001)
ENTITY: KEY(PROJECT('PROJECT_ID'),NAMESPACE('NS'),UserList,1,User,5000000000000001)

次のステップ