アプリケーションで異なる属性列をクエリ条件として使用する必要がある場合は、これらの属性列をセカンダリインデックスのプライマリキー列として指定して、クエリを高速化できます。 Tablestore は、さまざまな読み取り整合性要件を持つさまざまなクエリシナリオに対応するために、ローカルセカンダリインデックスとグローバルセカンダリインデックスを提供します。 このトピックでは、セカンダリインデックスの基本概念、インデックスタイプ、特徴、および考慮事項について説明します。
背景情報
Tablestore では、プライマリキーを指定することで、データテーブルのデータをクエリできます。 ただし、多くの場合、アプリケーションはデータテーブルのプライマリキー以外の属性に基づいてデータをクエリする必要があります。 この問題に対処するには、データテーブルに 1 つ以上のセカンダリインデックスを作成し、インデックステーブルを使用してデータをクエリします。
セカンダリインデックス機能を使用すると、データテーブルのプライマリキーと、テーブルに作成されたセカンダリインデックスのインデックスキー列に基づいてデータをクエリできます。 これにより、データクエリが高速化されます。 セカンダリインデックスを作成するときは、複数の属性をインデックステーブルのプライマリキー列として指定し、これらのプライマリキー列を使用して必要なデータをすばやく取得する必要があります。 特定のシナリオ例については、「シナリオ」をご参照ください。
用語
用語 | 説明 |
インデックステーブル | データテーブルのインデックス付き列に基づいて作成されたテーブル。 インデックステーブルはデータの読み取りにのみ使用でき、データの書き込みには使用できません。 |
事前定義列 | データテーブルの作成時に事前定義されているプライマリキー以外の列とそのタイプ。インデックステーブルのインデックスキー列または属性列として使用できます。 説明 Tablestore はスキーマフリーモデルを使用します。 行にはさまざまな属性列を書き込むことができます。 テーブルスキーマの属性列を指定する必要はありません。 |
一列インデックス | 一列インデックスは、単一の列に作成されるインデックスです。 |
結合インデックス | 複数の列に作成されるインデックス。 たとえば、結合インデックスにはインデックスキー列 1 と 2 を含めることができます。 |
インデックステーブル属性列 | インデックステーブルの属性列としてインデックステーブルにマッピングされた事前定義列。 |
オートコンプリート | インデックスキー列として指定されていないデータテーブルのプライマリキー列を、インデックステーブルのプライマリキー列としてインデックステーブルに自動的に追加できる機能。 |
インデックスタイプ
Tablestore は、グローバルセカンダリインデックスとローカルセカンダリインデックスの 2 種類のインデックスを提供します。 グローバルセカンダリインデックスは、データテーブルのインデックス付き列とプライマリキー列からインデックステーブルの列にデータを非同期モードで同期します。 同期遅延は数ミリ秒以内です。
強力な整合性クエリなどの要件を満たすために、Tablestore はローカルセカンダリインデックスを導入しました。 ローカルセカンダリインデックスは、データテーブルのインデックス付き列とプライマリキー列からインデックステーブルの列にデータを同期モードで同期します。 データがデータテーブルに書き込まれた後、すぐにインデックステーブルからデータをクエリできます。
次の表に、同期方法、最初のプライマリキー列の要件、同期遅延、および読み取り整合性に関するグローバルセカンダリインデックスとローカルセカンダリインデックスの違いを示します。
ディメンション | グローバルセカンダリインデックス | ローカルセカンダリインデックス |
同期方法 | 非同期モードでデータをクエリする | 同期方法 |
最初のプライマリキー列の要件 | データテーブルの任意のプライマリキー列または事前定義列を使用できます | データテーブルの最初のプライマリキー列と同じである必要があります |
同期遅延 | 数ミリ秒以内 | リアルタイム |
読み取り整合性 | 結果整合性 | 強力な整合性 |
特徴
セカンダリインデックスの特徴には、一列インデックスと結合インデックス、インデックス同期、カバリングインデックス、データテーブルの既存データを含むインデックス、および疎インデックスがあります。 次の表に、これらの特徴を示します。
特徴 | 説明 |
一列インデックスと結合インデックス | データテーブルの単一の列または複数の列にインデックスを作成できます。 |
インデックス同期 | グローバルセカンダリインデックスとローカルセカンダリインデックスは、異なるデータ同期方法を使用します。
|
カバリングインデックス | インデックステーブルに属性列を含めることができます。 データテーブルの作成時にいくつかの列(事前定義列と呼ばれる)を事前定義した後、データテーブルの任意の事前定義列とプライマリキー列にインデックスを作成し、データテーブルのいくつかの事前定義列をインデックステーブルの属性列として指定できます。 インデックステーブルの属性列として事前定義列を指定しないこともできます。 データテーブルの事前定義列をインデックステーブルの属性列として指定すると、インデックステーブルをクエリして事前定義列の値を取得できます。 データテーブルをクエリする必要はありません。 |
データテーブルの既存データを含むインデックス | データテーブルの既存データを含むインデックステーブルを作成できます。 |
疎インデックス | データテーブルの事前定義列をインデックステーブルの属性列として指定できます。 データテーブルの行に事前定義列が含まれていないが、すべてのインデックスキー列が含まれている場合、その行にインデックスが作成されます。 ただし、行にすべてのインデックス付き列が含まれていない場合、その行にインデックスを作成することはできません。 たとえば、データテーブルにプライマリキー列 PK0、PK1、PK2、および事前定義列 Defined0、Defined1、Defined2 が含まれているとします。 インデックスキー列 PK0、Defined0、Defined1、および属性列 Defined2 を含むインデックステーブルを作成します。
|
制限
詳細については、「セカンダリインデックスの制限」をご参照ください。
考慮事項
インデックステーブルを作成する場合の考慮事項
システムは、インデックスキー列として指定されていないデータテーブルのプライマリキー列を、インデックステーブルのプライマリキー列としてインデックステーブルに自動的に追加します。 インデックステーブルのデータをスキャンするときは、プライマリキー列の値を指定する必要があります。 値の範囲は負の無限大から正の無限大です。
インデックステーブルを作成するときは、インデックスキー列のみを指定する必要があります。 システムは他の列を自動的に追加します。 たとえば、データテーブルにプライマリキー列 PK0 と PK1、および事前定義列 Defined0 があるとします。
グローバルセカンダリインデックス機能を使用する場合は、必要に応じて列にインデックスを作成できます。
Defined0 にインデックスを作成すると、Tablestore はプライマリキー列が Defined0、PK0、PK1 であるインデックステーブルを生成します。
Defined0 と PK1 にインデックスを作成すると、Tablestore はプライマリキー列が Defined0、PK1、PK0 であるインデックステーブルを生成します。
PK1 にインデックスを作成すると、Tablestore はプライマリキー列が PK1 と PK0 であるインデックステーブルを生成します。
ローカルセカンダリインデックス機能を使用する場合は、インデックステーブルの最初のプライマリキー列がデータテーブルの最初のプライマリキー列と同じである必要があります。
PK0 と Defined0 にインデックスを作成すると、Tablestore はプライマリキー列が PK0、Defined0、PK1 であるインデックステーブルを生成します。
PK0、PK1、Defined0 にインデックスを作成すると、Tablestore はプライマリキー列が PK0、PK1、Defined0 であるインデックステーブルを生成します。
PK0 と PK1 にインデックスを作成すると、Tablestore はプライマリキー列が PK0 と PK1 であるインデックステーブルを生成します。
クエリパターンとコストの考慮事項に基づいて、データテーブルの適切な事前定義列をインデックステーブルの属性列として選択します。
データテーブルの事前定義列を、データテーブルに作成されたインデックステーブルの属性列として指定した後、インデックステーブルから事前定義列の値をクエリできます。 データテーブルをクエリする必要はありません。 ただし、これによりストレージコストが増加します。 データテーブルの事前定義列がインデックステーブルの属性列として指定されていない場合は、データテーブルから列の値をクエリする必要があります。
グローバルセカンダリインデックス機能を使用する場合は、適切な列をインデックステーブルの最初のプライマリキー列として選択します。
値が時間または日付である列がインデックステーブルの最初のプライマリキー列である場合、インデックステーブルの更新速度が低下する可能性があります。 したがって、このタイプの列をインデックステーブルの最初のプライマリキー列として指定しないことをお勧めします。
値が時間または日付である列をハッシュし、ハッシュされた列にインデックスを作成することをお勧めします。 そのような要件がある場合は、DingTalk を使用して Tablestore テクニカルサポートに連絡してください。
値の範囲が小さい列や列挙可能な値の列(たとえば、性別列)をインデックステーブルの最初のプライマリキー列として指定しないことをお勧めします。 これにより、インデックステーブルの水平スケーリング機能が制限され、インデックステーブルの書き込みパフォーマンスに影響を与える可能性があります。
インデックステーブルを使用する場合の使用上の注意
インデックステーブルを持つデータテーブルにデータを書き込むときは、次のルールに従う必要があります。 そうしないと、データはデータテーブルに書き込まれません。
データテーブルに書き込むデータのバージョン番号を指定することはできません。
バッチ書き込みリクエストでは、データテーブルの同じ行(同じプライマリキーを持つ)にデータを繰り返し書き込むことはできません。
インデックステーブルはデータのクエリにのみ使用でき、データを直接書き込むことはできません。
関連操作
次の表に、セカンダリインデックスに関連する操作を示します。
操作 | 説明 |
既存のデータテーブルにインデックステーブルを作成します。 説明
| |
インデックステーブルから 1 行のデータを読み取ります。 | |
インデックステーブルから指定された範囲内のデータを読み取ります。 | |
データテーブルに作成されたセカンダリインデックスを削除します。 重要 DeleteTable 操作を使用してデータテーブルを削除する前に、まずデータテーブルのすべてのインデックステーブルを削除する必要があります。 そうしないと、データテーブルは削除されません。 |
使用方法
Tablestore コンソール、Tablestore CLI、または Tablestore SDK を使用してセカンダリインデックスを使用できます。
課金
セカンダリインデックス機能を使用すると、インデックスデータによって追加のデータストレージが生成され、インデックスデータのクエリによって読み取りスループットが消費されます。 詳細については、「セカンダリインデックスの課金」をご参照ください。
参考資料
複数条件の組み合わせクエリ、フルテキストインデックス、プレフィックスクエリ、あいまいクエリなど、より柔軟で豊富なデータアクセラレーションクエリメソッドが必要な場合は、多次元インデックスを使用して実装できます。