すべてのプロダクト
Search
ドキュメントセンター

:セカンダリインデックスの作成

最終更新日:Dec 28, 2024

セカンダリインデックス機能を使用すると、データテーブルのプライマリキーと、データテーブルに作成されたセカンダリインデックスのインデックスカラムに基づいてデータをクエリできます。データテーブルの属性カラムを使用してデータをクエリする必要がある場合は、データテーブルのセカンダリインデックスを作成してデータクエリを高速化できます。データテーブルのセカンダリインデックスを作成するときは、セカンダリインデックスのインデックスカラムまたは属性カラムを、データテーブルの作成時に指定した事前定義カラムに設定できます。 CreateIndexオペレーションを呼び出して、既存のデータテーブルのインデックステーブルを作成できます。

説明
  • セカンダリインデックスは、グローバルセカンダリインデックスとローカルセカンダリインデックスに分類されます。セカンダリインデックス機能の詳細については、概要を参照してください。

  • CreateTableオペレーションを呼び出すことで、データテーブルの作成時に1つ以上のインデックステーブルを作成できます。詳細については、データテーブルの作成を参照してください。

前提条件

  • OTSClientインスタンスが初期化されていること。詳細については、OTSClientインスタンスの初期化を参照してください。

  • maxVersionsパラメータが1に設定されているデータテーブルが作成されていること。データテーブルのtimeToLiveパラメータは、以下のいずれかの条件を満たしている必要があります。

    • データテーブルのtimeToLiveパラメータが-1に設定されていること。これは、データテーブル内のデータが期限切れにならないことを意味します。

    • データテーブルのtimeToLiveパラメータが-1以外の値に設定されており、データテーブルの更新操作が禁止されていること。

  • データテーブルに事前定義カラムが指定されていること。

使用上の注意

  • インデックステーブルの名前は、既存の時系列テーブルまたはデータテーブルの名前と異なる必要があります。

  • セカンダリインデックスを作成すると、Tablestoreは、インデックスカラムとして指定されていないデータテーブルのプライマリキーカラムを、セカンダリインデックスのプライマリキーカラムとしてセカンダリインデックスに自動的に追加します。

  • ローカルセカンダリインデックスを作成する場合、インデックステーブルの最初のプライマリキーカラムは、データテーブルの最初のプライマリキーカラムと同じである必要があります。

パラメータ

パラメータ

説明

mainTableName

データテーブルの名前。

indexMeta

インデックステーブルに関するスキーマ情報。スキーマ情報には、以下の項目が含まれます。

  • indexName: インデックステーブルの名前。

  • primaryKey: インデックステーブルのプライマリキー。プライマリキーは、すべてのプライマリキーカラムと、データテーブルの事前定義カラムのランダムな数の組み合わせです。

    ローカルセカンダリインデックスを作成する場合、インデックステーブルの最初のプライマリキーカラムは、データテーブルの最初のプライマリキーカラムと同じである必要があります。

  • definedColumns: インデックステーブルの属性カラム。属性カラムは、データテーブルの事前定義カラムの組み合わせです。

  • indexType: インデックステーブルのタイプ。有効な値: IT_GLOBAL_INDEX および IT_LOCAL_INDEX。

    • indexTypeパラメータを指定しない場合、またはindexTypeパラメータをIT_GLOBAL_INDEXに設定した場合、グローバルセカンダリインデックスが作成されます。

      Tablestoreは、データテーブルのインデックス付きカラムとプライマリキーカラムから、作成するインデックステーブルのカラムに、非同期モードでデータを自動的に同期します。同期のレイテンシは数ミリ秒以内です。

    • indexTypeパラメータをIT_LOCAL_INDEXに設定した場合、ローカルセカンダリインデックスが作成されます。

      Tablestoreは、データテーブルのインデックス付きカラムとプライマリキーカラムから、作成するインデックステーブルのカラムに、同期モードでデータを自動的に同期します。データがデータテーブルに書き込まれた後、すぐにインデックステーブル内のデータをクエリできます。

  • indexUpdateMode: インデックステーブルの更新モード。有効な値: IUM_ASYNC_INDEX および IUM_SYNC_INDEX。

    • indexUpdateModeパラメータを指定しない場合、またはindexUpdateModeパラメータをIUM_ASYNC_INDEXに設定した場合、非同期モードを使用してインデックスが更新されます。

      グローバルセカンダリインデックス機能を使用する場合は、indexUpdateModeパラメータをIUM_ASYNC_INDEXに設定する必要があります。

    • indexUpdateModeパラメータをIUM_SYNC_INDEXに設定した場合、同期モードを使用してインデックスが更新されます。

      ローカルセカンダリインデックス機能を使用する場合は、indexUpdateModeパラメータをIUM_SYNC_INDEXに設定する必要があります。

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); 
}

関連情報