セカンダリインデックス機能を使用すると、データテーブルのプライマリキーと、データテーブルに作成されたセカンダリインデックスのインデックスカラムに基づいてデータをクエリできます。データテーブルの属性カラムを使用してデータをクエリする必要がある場合は、データテーブルのセカンダリインデックスを作成してデータクエリを高速化できます。データテーブルのセカンダリインデックスを作成するときは、セカンダリインデックスのインデックスカラムまたは属性カラムを、データテーブルの作成時に指定した事前定義カラムに設定できます。 CreateIndexオペレーションを呼び出して、既存のデータテーブルのインデックステーブルを作成できます。
セカンダリインデックスは、グローバルセカンダリインデックスとローカルセカンダリインデックスに分類されます。セカンダリインデックス機能の詳細については、概要を参照してください。
CreateTableオペレーションを呼び出すことで、データテーブルの作成時に1つ以上のインデックステーブルを作成できます。詳細については、データテーブルの作成を参照してください。
前提条件
OTSClientインスタンスが初期化されていること。詳細については、OTSClientインスタンスの初期化を参照してください。
maxVersionsパラメータが1に設定されているデータテーブルが作成されていること。データテーブルのtimeToLiveパラメータは、以下のいずれかの条件を満たしている必要があります。
データテーブルのtimeToLiveパラメータが-1に設定されていること。これは、データテーブル内のデータが期限切れにならないことを意味します。
データテーブルのtimeToLiveパラメータが-1以外の値に設定されており、データテーブルの更新操作が禁止されていること。
データテーブルに事前定義カラムが指定されていること。
使用上の注意
インデックステーブルの名前は、既存の時系列テーブルまたはデータテーブルの名前と異なる必要があります。
セカンダリインデックスを作成すると、Tablestoreは、インデックスカラムとして指定されていないデータテーブルのプライマリキーカラムを、セカンダリインデックスのプライマリキーカラムとしてセカンダリインデックスに自動的に追加します。
ローカルセカンダリインデックスを作成する場合、インデックステーブルの最初のプライマリキーカラムは、データテーブルの最初のプライマリキーカラムと同じである必要があります。
パラメータ
パラメータ | 説明 |
mainTableName | データテーブルの名前。 |
indexMeta | インデックステーブルに関するスキーマ情報。スキーマ情報には、以下の項目が含まれます。
|
includeBaseData | データテーブルの既存のデータをインデックステーブルに含めるかどうかを指定します。 includeBaseDataパラメータは、CreateIndexRequestの最後のパラメータです。 includeBaseDataパラメータをtrueに設定すると、インデックステーブルにはデータテーブルの既存のデータが含まれます。 includeBaseDataパラメータをfalseに設定すると、インデックステーブルにはデータテーブルの既存のデータは含まれません。 |
例
グローバルセカンダリインデックスの作成
次のサンプルコードは、データテーブルのグローバルセカンダリインデックスを作成する方法の例を示しています。
private static void createIndex(SyncClient client) {
// インデックステーブルの名前を指定します。
IndexMeta indexMeta = new IndexMeta("<INDEX_NAME>");
// DEFINED_COL_NAME_1カラムをインデックステーブルの最初のプライマリキーカラムとして指定します。
indexMeta.addPrimaryKeyColumn(DEFINED_COL_NAME_1);
// PRIMARY_KEY_NAME_2カラムをインデックステーブルの2番目のプライマリキーカラムとして指定します。
indexMeta.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2);
// DEFINED_COL_NAME_2カラムをインデックステーブルの属性カラムとして指定します。
indexMeta.addDefinedColumn(DEFINED_COL_NAME_2);
// インデックステーブルを作成するデータテーブルを指定し、インデックステーブルにデータテーブルの既存のデータを含めることを指定します。インデックステーブルに指定した設定を適用します。
//CreateIndexRequest request = new CreateIndexRequest("<TABLE_NAME>", indexMeta, true);
// インデックステーブルを作成するデータテーブルを指定し、インデックステーブルにデータテーブルの既存のデータを含めないことを指定します。インデックステーブルに指定した設定を適用します。
CreateIndexRequest request = new CreateIndexRequest("<TABLE_NAME>", indexMeta, false);
/**IncludeBaseDataパラメータをtrueに設定すると、インデックステーブルの作成後に、データテーブルの既存のデータをインデックステーブルに同期できます。その後、インデックステーブルからすべてのデータをクエリできます。
データテーブルの既存のデータをインデックステーブルに同期するために必要な時間は、データテーブル内のデータ量によって異なります。
*/
//request.setIncludeBaseData(true);
// インデックステーブルを作成します。
client.createIndex(request);
}
ローカルセカンダリインデックスの作成
次のサンプルコードは、ローカルセカンダリインデックスを作成する方法の例を示しています。
private static void createIndex(SyncClient client) {
// インデックステーブルの名前を指定します。
IndexMeta indexMeta = new IndexMeta("<INDEX_NAME>");
// PRIMARY_KEY_NAME_1カラムをインデックステーブルの最初のプライマリキーカラムとして指定します。
// ローカルセカンダリインデックスの最初のプライマリキーカラムは、データテーブルの最初のプライマリキーカラムと同じである必要があります。
indexMeta.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1);
// DEFINED_COL_NAME_1カラムをインデックステーブルの2番目のプライマリキーカラムとして指定します。
indexMeta.addPrimaryKeyColumn(DEFINED_COL_NAME_1);
// DEFINED_COL_NAME_2カラムをインデックステーブルの属性カラムとして指定します。
indexMeta.addDefinedColumn(DEFINED_COL_NAME_2);
// インデックスタイプをローカルセカンダリインデックス(IT_LOCAL_INDEX)に設定します。
indexMeta.setIndexType(IT_LOCAL_INDEX);
// インデックス更新モードを同期更新(IUM_SYNC_INDEX)に設定します。
indexMeta.setIndexUpdateMode(IUM_SYNC_INDEX);
// インデックステーブルを作成するデータテーブルを指定し、インデックステーブルにデータテーブルの既存のデータを含めることを指定します。インデックステーブルに指定した設定を適用します。
//CreateIndexRequest request = new CreateIndexRequest("<TABLE_NAME>", indexMeta, true);
// インデックステーブルを作成するデータテーブルを指定し、インデックステーブルにデータテーブルの既存のデータを含めないことを指定します。インデックステーブルに指定した設定を適用します。
CreateIndexRequest request = new CreateIndexRequest("<TABLE_NAME>", indexMeta, false);
/**IncludeBaseDataパラメータをtrueに設定すると、インデックステーブルの作成後に、データテーブルの既存のデータをインデックステーブルに同期できます。その後、インデックステーブルからすべてのデータをクエリできます。
データテーブルの既存のデータをインデックステーブルに同期するために必要な時間は、データテーブル内のデータ量によって異なります。
*/
//request.setIncludeBaseData(true);
// インデックステーブルを作成します。
client.createIndex(request);
}
関連情報
セカンダリインデックスを作成した後、セカンダリインデックスを使用して、1行のデータ、またはプライマリキー値が特定の範囲内にあるデータを読み取ることができます。詳細については、セカンダリインデックスを使用したデータの読み取りを参照してください。
不要になったセカンダリインデックスを削除できます。詳細については、セカンダリインデックスの削除を参照してください。