グローバル セカンダリ インデックスを作成する

継続的マテリアライズド ビューは、テーブルのグローバル セカンダリ インデックスとして使用できます。

このページを読む前に、継続的マテリアライズド ビューを理解しておいてください。

Bigtable テーブルのデータは通常、行キーでインデックス登録されます。ただし、ソーステーブルから継続的マテリアライズド ビューを作成し、グローバル セカンダリ インデックスとして使用することはできます。これにより、マテリアライズド ビューにクエリを実行して、さまざまなクエリ ルックアップ パターンを使用して同じデータを取得できます。

グローバル セカンダリ インデックスは、ソーステーブルの行キーとは異なる行キーとともに、ソーステーブルの列のサブセットを含む継続的なマテリアライズド ビューです。これらの行キーは、アプリケーションが異なるクエリ ルックアップ パターンに基づいて同じデータを取得できるようにする次の変換に基づく場合があります。

  • ソーステーブル内の属性(列修飾子、列値、ソース行キーの一部など)。
  • 行キーの再フォーマット。
  • 行キーと属性を組み合わせる変換。

Bigtable は、グローバル セカンダリ インデックスをソーステーブルと自動的に同期させます。この同期は結果整合性が保たれる方法で行われます。

グローバル セカンダリ インデックスを使用する場合

アプリケーションでは、異なるルックアップ パターンや属性を使用して同じデータをクエリする必要があることがよくあります。たとえば、メールアドレスまたは電話番号でユーザー情報を取得するアプリケーションを考えてみましょう。両方のクエリ パターンで同じレベルのパフォーマンスが必要になる場合があります。メールアドレスを Bigtable 行キーにして、電話番号を列に保存すると、テーブルのフルスキャンが必要になるため、電話番号のルックアップのパフォーマンスが低下します。

電話番号で検索する際のクエリ パフォーマンスを向上させるには、SQL ステートメントを使用して継続的マテリアライズド ビューを作成します。SQL ステートメントは、異なる行キーを使用してデータを再構築する方法を Bigtable に指示します。継続的マテリアライズド ビューは、クエリ可能なテーブルのように機能します。次に、ビューをグローバル セカンダリ インデックスとして使用します。これにより、アプリケーションは同じデータに別のアクセスパスでアクセスできます。各パスは異なる行キーを使用するため、クエリごとに代替パスを選択できます。クエリに最適なパスを選択するには、各テーブルの行キーの構造と、各テーブルに保存されているデータを理解します。

継続的マテリアライズド ビューをグローバル セカンダリ インデックスとして使用すると、次のユースケースでクエリのパフォーマンスを向上させることができます。

  • データの再キー設定: ソーステーブルの行キーとは異なるキーを使用してデータをクエリする必要がある場合は、代替キーを使用して継続的マテリアライズド ビューを作成し、そのビューに対してクエリを実行できます。
  • データのフィルタリング: ソーステーブルをフィルタして、グローバル セカンダリ インデックスに特定の行のデータのみを入力する場合は、ビューを定義する SQL クエリで WHERE 句を指定します。
  • 属性キー: 列修飾子や値などのキー以外の属性に基づいてデータをクエリする必要がある場合は、ORDER BY 句に含めることができます。

グローバル セカンダリ インデックスについて

Bigtable で継続的マテリアライズド ビューをグローバル セカンダリ インデックスとして使用する場合は、次の要件を考慮してください。

  • 新しいグローバル セカンダリ インデックスの行キーには、ソーステーブルの行キーを含める必要があります。これにより、ソーステーブルの行と継続的マテリアライズド ビューのグローバル セカンダリ インデックスの行との間の 1 対 1 のマッピングを確保できます。
  • グローバル セカンダリ インデックスは、ソーステーブルと同じスキーマや属性を持つ必要はありません。SQL クエリの SELECT 部分で、テーブルから必要な列と、適用するデータの SQL 変換を指定する必要があります。
  • グローバル セカンダリ インデックスは、クエリ パターンに必要なデータのみをコピーする必要があります。ソーステーブルにすべてのソースデータを提供する必要はありません。
  • Bigtable では、選択した行キーによってデフォルトの並べ替え順序が提供されます。

グローバル セカンダリ インデックスをクエリするには、次の要件を考慮してください。

  • ORDER BY 句のすべての列は、SELECT 句にも含まれている必要があります。
  • グローバル セカンダリ インデックスを定義したら、アプリケーションは、ソーステーブルまたはグローバル セカンダリ インデックスを表すマテリアライズド ビューのどちらをクエリするかを選択できる必要があります。
  • アプリケーションはインデックスに直接書き込みません。インデックスはソーステーブルと継続的に同期されます。常にソーステーブルに書き込みます。
  • グローバル セカンダリ インデックスは最終的に整合性が保たれます。データは最初にソーステーブルに書き込まれ、次にグローバル セカンダリ インデックス形式に変換されます。
  • カバリング インデックスを作成することをおすすめします。詳細については、このドキュメントのカバリング インデックスをご覧ください。
  • ORDER BY 句には、ソーステーブルの変更されていない行キーが含まれている必要があります。また、すべてのデータは昇順で並べ替える必要があります。ソーステーブルの行キーは常にマテリアライズド ビューに投影されますが、他の属性と組み合わせることはできます。
  • ORDER BY 句の列は、グローバル セカンダリ インデックスの構造化された行キーの一部になります。選択した他のすべての列は、グローバル セカンダリ インデックスのキー以外の列の値になります。ORDER BY 句の値を特定の GoogleSQL for Bigtable データ型に変換すると、グローバル セカンダリ インデックスの構造化された行キーでデータ型が保持されます。

カバリング インデックス

カバリング インデックスには、クエリに必要なすべての列が含まれます。カバリング インデックスをクエリすると、Bigtable はソーステーブルにアクセスせずに、必要なすべてのデータをインデックスから直接取得できます。このアプローチではディスク読み取りの回数が最小限に抑えられるため、パフォーマンスを最適化できます。カバリング インデックスを作成するには、SELECT ステートメントで、クエリに必要なすべての列が指定されていることを確認します。

非カバリング インデックスを作成する場合は、インデックスに対してクエリを実行し、その結果を使用して、ソーステーブルから必要な追加の列を検索します。

グローバル セカンダリ インデックスを定義する

グローバル セカンダリ インデックスを作成するには、グローバル セカンダリ インデックスを定義する SQL クエリを使用して継続的マテリアライズド ビューを作成します。

次の例では、SQL クエリでユーザー インタラクション データをクエリできるグローバル セカンダリ インデックスを作成します。ORDER BY 句は、ユーザーの電話番号、ユーザー ID、メールアドレスの組み合わせを使用して、グローバル セカンダリ インデックスの構造化された行キーを定義します。また、activity 列ファミリーに interactions という名前を割り当てます。

SELECT
  user['phone'] AS phone,
  CAST(user['id'] AS INT64) AS user_id,
  _key AS email,
  activity AS interactions
FROM CLICKS_TABLE
ORDER BY 1, 2, 3;

次の表では、ソーステーブルの同じ行のビューと対応するグローバル セカンダリ インデックスを比較して、インデックスがどのように作成されるかについて説明します。

ソーステーブルの行 グローバル セカンダリ インデックスの行
行キー:
_key: user1@example.com



属性:
user: {id: "123", phone: "555-123-4567"}
activity: {action: "CLICKED_PRODUCT_A"}
構造化された行キー:
phone: 555-123-4567
user_id: 123
email: user1@example.com

属性:
interactions: {action: "CLICKED_PRODUCT_A"}
行キー:
_key: user2@example.com



属性:
user: {id: "456", phone: "555-987-6543"}
activity: {action: "VIEWED_PRODUCT_B"}
構造化された行キー:
phone: 555-987-6543
user_id: 456
email: user2@example.com

属性:
interactions: {action: "VIEWED_PRODUCT_B"}
行キー:
_key: user3@example.com



属性:
user: {id: "1000", phone: "555-111-2222"}
activity: {action: "ADDED_TO_CART_PRODUCT_C"}
構造化された行キー:
phone: 555-111-2222
user_id: 1000
email: user3@example.com

属性:
interactions: {action: "ADDED_TO_CART_PRODUCT_C"}

制限事項

  • グローバル セカンダリ インデックス キーである出力キーを読み取るには、SQL クエリのみを使用できます。

次のステップ