グローバル セカンダリ インデックスを作成する
継続的マテリアライズド ビューは、テーブルのグローバル セカンダリ インデックスとして使用できます。
このページを読む前に、継続的マテリアライズド ビューを理解しておいてください。
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 クエリのみを使用できます。