非同期セカンダリ インデックスを作成する

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

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

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 クエリのみを使用できます。

次のステップ