アプリケーションが異なる属性をクエリ条件として使用してデータをクエリする必要がある場合、これらの属性をセカンダリインデックスのプライマリキー列として設定して、クエリを高速化できます。 Tablestoreは、データクエリ中の読み取り整合性に関するさまざまな要件を満たすために、ローカルセカンダリインデックスとグローバルセカンダリインデックスの機能を提供します。このトピックでは、セカンダリインデックスの用語と機能、セカンダリインデックスタイプ間の違い、およびセカンダリインデックスの使用上の注意について説明します。
背景情報
Tablestoreのデータテーブルのデータを、データテーブルのプライマリキーを指定することでクエリできます。ただし、ほとんどの場合、多くのアプリケーションは、データテーブルのプライマリキー以外の属性を使用してデータをクエリする必要があります。この要件を満たすために、1つ以上のセカンダリインデックスを作成し、インデックステーブルを使用してデータをクエリできます。
セカンダリインデックス機能を使用すると、データテーブルのプライマリキーと、データテーブルに対して作成されたセカンダリインデックスのインデックスキー列に基づいてデータをクエリできます。これにより、クエリの効率が向上します。セカンダリインデックスを作成するときは、クエリする属性をインデックステーブルのプライマリキー列として設定する必要があります。その後、インデックステーブルのプライマリキー列を使用してデータをクエリできます。詳細については、シナリオを参照してください。
用語
用語 | 説明 |
インデックステーブル | データテーブルのインデックス付き列に基づいて作成されるテーブル。 インデックステーブルのデータは読み取り専用です。 |
事前定義列 | データテーブルを作成するときに事前定義される非プライマリキー列。事前定義列は、インデックステーブルのインデックスキー列または属性列として使用できます。事前定義列を追加するときは、そのデータ型を指定する必要があります。 説明 Tablestoreはスキーマフリーモデルを使用します。テーブルスキーマで属性列を指定する必要なく、異なる属性列を行に書き込むことができます。 |
単一列インデックス | 単一列に作成されるインデックス。 |
複合インデックス | 複数列に作成されるインデックス。たとえば、複合インデックスはインデックスキー列1と2を持つことができます。 |
インデックス付き属性列 | データテーブルからインデックステーブルにインデックステーブルの事前定義列としてマッピングされる事前定義列。 |
オートコンプリート | インデックスキー列として指定されていないデータテーブルのプライマリキー列を、インデックステーブルのプライマリキー列としてインデックステーブルに自動的に追加できるようにする機能。 |
セカンダリインデックスタイプ
Tablestoreでは、セカンダリインデックスはグローバルセカンダリインデックスとローカルセカンダリインデックスに分類されます。グローバルセカンダリインデックス機能を使用する場合、Tablestoreは、インデックステーブルが作成されるデータテーブルのインデックス付き列とプライマリキー列からインデックステーブルへのデータを非同期モードで自動的に同期します。同期のレイテンシは数ミリ秒以内です。
データクエリ中の強い整合性に関するユーザー要件を満たすために、Tablestoreはローカルセカンダリインデックス機能を提供します。ローカルセカンダリインデックス機能を使用する場合、Tablestoreは、インデックステーブルが作成されるデータテーブルのインデックス付き列とプライマリキー列からインデックステーブルへのデータを同期モードで自動的に同期します。データがデータテーブルに書き込まれた後、すぐにインデックステーブルからデータをクエリできます。
次の表に、グローバルセカンダリインデックスとローカルセカンダリインデックスの違いを、同期モード、最初のプライマリキー列の要件、同期レイテンシ、および読み取り整合性の観点から示します。
項目 | グローバルセカンダリインデックス | ローカルセカンダリインデックス |
同期モード | 非同期モード | 同期モード |
最初のプライマリキー列の要件 | グローバルセカンダリインデックスの最初のプライマリキー列は、セカンダリインデックスが作成されるデータテーブルの任意のプライマリキー列または事前定義列にすることができます。 | ローカルセカンダリインデックスの最初のプライマリキー列は、セカンダリインデックスが作成されるデータテーブルの最初のプライマリキー列と同じである必要があります。 |
同期レイテンシ | 数ミリ秒以内 | リアルタイム |
読み取り整合性 | 結果整合性 | 強い整合性 |
機能
セカンダリインデックスの機能には、単一列インデックス、複合インデックス、インデックス同期、カバードインデックス、データテーブルの履歴データを含むインデックス、およびスパースインデックスが含まれます。次の表に、上記の機能について説明します。
機能 | 説明 |
単一列インデックスと複合インデックス | データテーブルの1つ以上の列にインデックスを作成できます。 |
インデックス同期 | グローバルセカンダリインデックスとローカルセカンダリインデックスは、異なるモードでデータを同期します。
|
カバードインデックス | インデックステーブルには属性列を含めることができます。データテーブルを作成するときに、事前定義列を作成できます。その後、データテーブルの事前定義列とプライマリキー列に基づいてインデックステーブルを作成できます。データテーブルの複数の事前定義列をインデックステーブルの属性列として指定できます。また、インデックステーブルに属性列を指定しないこともできます。 データテーブルの複数の事前定義列をインデックステーブルの属性列として指定すると、インデックステーブルから事前定義列の値をクエリできます。データテーブルをクエリする必要はありません。 |
データテーブルの履歴データを含むインデックス | データテーブルの履歴データを含むインデックステーブルを作成できます。 |
スパースインデックス | データテーブルの事前定義列をインデックステーブルの属性列として指定できます。データテーブルの行に事前定義列が含まれていないが、すべてのインデックスキー列が含まれている場合、その行にインデックスが作成されます。ただし、行に一部のインデックスキー列が含まれていない場合、その行にインデックスを作成することはできません。 たとえば、データテーブルにプライマリキー列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テクニカルサポートに連絡してください。
カーディナリティの低い列または列挙値を含む列をインデックステーブルの最初のプライマリキー列として指定しないことをお勧めします。たとえば、性別列をインデックステーブルの最初のプライマリキー列として指定すると、インデックステーブルの水平方向のスケーラビリティが制限されます。その結果、書き込みパフォーマンスが低下します。
インデックステーブルの使用に関する使用上の注意
インデックステーブルが作成されるデータテーブルにデータを書き込むときは、次のルールに従う必要があります。そうでない場合、データはデータテーブルに書き込むことができません。
データテーブルに書き込むデータにバージョン番号を指定することはできません。
バッチ書き込み操作では、同じプライマリキー値を持つ重複行が存在することはできません。
インデックステーブルは、データのクエリにのみ使用できます。インデックステーブルにデータを書き込むことはできません。
API操作
次の表に、Tablestoreがセカンダリインデックスを管理するために提供するAPI操作を示します。
API操作 | 説明 |
既存のデータテーブルのインデックステーブルを作成します。 説明
| |
インデックステーブルからデータの行を読み取ります。 | |
指定された範囲内のデータをインデックステーブルから読み取ります。 | |
データテーブルからインデックステーブルを削除します。 重要 DeleteTable操作を呼び出してデータテーブルを削除する前に、データテーブルに作成されたインデックステーブルを最初に削除する必要があります。そうでない場合、データテーブルを削除することはできません。 |
セカンダリインデックスの使用
セカンダリインデックスは、Tablestoreコンソール、Tablestore CLI、またはTablestore SDKを使用して使用できます。詳細については、次のトピックを参照してください。
課金
セカンダリインデックス機能を使用すると、ストレージ料金が発生します。さらに、データテーブルにデータを書き込むとき、データテーブルのインデックステーブルを作成するとき、またはデータを読み取るときに、コンピューティングリソースが消費されます。詳細については、セカンダリインデックスの課金対象項目を参照してください。
参考資料
より効率的かつ柔軟な方法でデータをクエリする場合は、サーチインデックス機能を使用できます。サーチインデックス機能は、ブールクエリ、全文検索、プレフィックスクエリ、あいまいクエリなど、複数のクエリメソッドを提供します。詳細については、概要を参照してください。