このトピックでは、データテーブルのプライマリキーに基づくクエリ、セカンダリインデックスに基づくクエリ、およびサーチインデックスに基づくクエリについて詳しく分析します。また、セカンダリインデックスとサーチインデックスの選択方法についても提案します。
背景情報
Tablestoreデータテーブルのデータをクエリするには、プライマリキーまたはプライマリキー値の範囲を指定する必要があります。GetRow操作を呼び出して、指定されたプライマリキーに基づいて行をクエリするか、GetRange操作を呼び出して、プライマリキー値が指定された範囲内にある行をクエリできます。フィルター機能は、属性列のデータをクエリするために使用されます。属性列に大量のデータが含まれている場合、フィルター機能のクエリ効率は低く、フルテーブルスキャンが必要になる場合もあります。詳細については、データの読み取りを参照してください。
大量のデータに対するフィルター機能のクエリ効率が不十分であることに加えて、データテーブルのプライマリキーに基づくクエリは、実際のシナリオではビジネス要件を満たさない場合があります。データをクエリするのに役立つように、Tablestoreはセカンダリインデックスとサーチインデックスを提供しています。
概要
Tablestoreは、データクエリの高速化のためにセカンダリインデックスとサーチインデックスを提供しています。
セカンダリインデックスに基づくクエリ
データテーブルのセカンダリインデックスを作成すると、データテーブルのインデックステーブルが作成されます。インデックステーブルのモデルは、データテーブルのモデルと同じです。インデックステーブルは、ビジネスシナリオに基づいてクエリ効率を向上させるために使用できるカスタムスキーマを提供します。詳細については、概要を参照してください。
インデックステーブルを使用して、指定されたプライマリキー、プライマリキー値の範囲、またはプライマリキー列のプレフィックス範囲に基づいてデータをクエリできます。Tablestoreは、インデックスキー列として指定されていないデータテーブルのプライマリキー列を、インデックステーブルのプライマリキー列としてインデックステーブルに自動的に追加します。これにより、インデックステーブルの各行のプライマリキー値が一意であることが保証されます。
Tablestoreでは、セカンダリインデックスはグローバルセカンダリインデックスとローカルセカンダリインデックスに分類されます。グローバルセカンダリインデックス機能を使用する場合、Tablestoreは、インデックステーブルが作成されたデータテーブルのインデックス付き列とプライマリキー列のデータを、非同期モードでインデックステーブルに自動的に同期します。同期レイテンシは数ミリ秒以内です。
データクエリ中の強い整合性に関するユーザー要件を満たすために、Tablestoreはローカルセカンダリインデックス機能を提供します。ローカルセカンダリインデックス機能を使用する場合、Tablestoreは、インデックステーブルが作成されたデータテーブルのインデックス付き列とプライマリキー列のデータを、同期モードでインデックステーブルに自動的に同期します。データがデータテーブルに書き込まれた後、すぐにインデックステーブルからデータをクエリできます。
次の表は、グローバルセカンダリインデックスとローカルセカンダリインデックスの違いを、同期モード、最初のプライマリキー列の要件、同期レイテンシ、および読み取り整合性の観点から説明しています。
項目 | グローバルセカンダリインデックス | ローカルセカンダリインデックス |
同期モード | 非同期モード | 同期モード |
最初のプライマリキー列の要件 | グローバルセカンダリインデックスの最初のプライマリキー列は、セカンダリインデックスが作成されたデータテーブルの任意のプライマリキー列または事前定義された列にすることができます。 | ローカルセカンダリインデックスの最初のプライマリキー列は、セカンダリインデックスが作成されたデータテーブルの最初のプライマリキー列と同じである必要があります。 |
同期レイテンシ | 数ミリ秒以内 | リアルタイム |
読み取り整合性 | 結果整合性 | 強い整合性 |
サーチインデックスに基づくクエリ
サーチインデックスは、転置インデックスや時空間インデックスなど、さまざまなインデックススキーマをサポートしています。したがって、データテーブルのプライマリキーに基づくクエリやセカンダリインデックスに基づくクエリとは異なり、サーチインデックスに基づくクエリは、ブールクエリ、あいまいクエリ、地理クエリ、全文検索など、複数のクエリメソッドをサポートしています。詳細については、概要を参照してください。
サーチインデックスは、セカンダリインデックスよりも多くの機能を提供します。サーチインデックスを使用して、さまざまな条件を指定して複数次元からデータをクエリできます。
インデックスを選択する
クエリ条件に基づいてインデックスを使用する必要があるかどうかを確認します。
ほとんどの場合、次のクエリシナリオではインデックスを使用する必要はありません。
インデックスを使用する必要がある場合は、ビジネス要件に基づいてセカンダリインデックスまたはサーチインデックスを選択します。
セカンダリインデックスは、データテーブルに似たインデックステーブルです。セカンダリインデックスは、特定の方法を使用してインデックステーブルのプライマリキー列を配置するデータ分散モードを提供します。1つのインデックスは1つのクエリ条件をサポートします。セカンダリインデックスは、指定されたクエリ条件に基づいてデータを配置して、クエリパフォーマンスを向上させます。インデックステーブルは、データテーブルと同じ量のデータをサポートします。セカンダリインデックスのプライマリキーを指定する場合は、ハッシュを考慮する必要があります。
サーチインデックスには、スキーマの組み合わせが含まれています。各列は、転置インデックスなどのスキーマをサポートしています。クエリ結果を列でソートできます。1つのサーチインデックスは複数のクエリ条件をサポートできます。異なるクエリ条件に対して複数のサーチインデックスを作成する必要はありません。
セカンダリインデックスと比較して、サーチインデックスは、ブールクエリ、あいまいクエリ、全文検索、地理クエリなど、複数のクエリメソッドをサポートしています。また、サーチインデックスは、データフィルタリングを高速化するために複数のスキーマをサポートしていますが、データを固定順序で読み取る場合は、セカンダリインデックスほど効率的ではありません。サーチインデックスのクエリパフォーマンスは、データテーブルのサイズによって異なります。データテーブルに数百億行が含まれている場合は、ルーティングキーを使用してデータをシャーディングすることをお勧めします。ルーティングキーを使用して、クエリ内のデータ量を削減することもできます。