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

このページでは、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)

次のステップ