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

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

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

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句の値を Bigtable 用の特定の GoogleSQL データ型に変換すると、非同期セカンダリ インデックスの構造化された行キーでデータ型が保持されます。

カバリング インデックス

カバリング インデックス には、クエリに必要なすべての列が含まれます。カバリング インデックスにクエリを実行すると、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 クエリのみを使用できます。

次のステップ