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

:Tablestore SDK を使用してセカンダリインデックスの使用を開始する

最終更新日:Dec 28, 2024

セカンダリインデックス機能を使用すると、データテーブルのプライマリキーと、データテーブル用に作成されたセカンダリインデックスのインデックスカラムに基づいてデータをクエリできます。データテーブルの属性カラムを使用してデータをクエリする場合、データテーブルのセカンダリインデックスを作成してデータクエリを高速化できます。データテーブルのセカンダリインデックスを作成するときは、セカンダリインデックスのインデックスカラムまたは属性カラムを、データテーブルの作成時に指定した定義済みカラムに設定できます。セカンダリインデックスを作成したら、セカンダリインデックスを使用してデータをクエリできます。

前提条件

Max Versions パラメータが 1 に設定されたデータテーブルが作成されます。データテーブルの TTL パラメータは、次のいずれかの条件を満たしています。

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

  • データテーブルの TTL パラメータが -1 に設定されていない場合、更新を許可パラメータは いいえ に設定されています。

説明

セカンダリインデックスの TTL は、データテーブルの TTL と同じです。

ステップ 1: (オプション) 定義済みカラムを管理する

テーブルのセカンダリインデックスを作成し、テーブルに定義済みカラムが含まれていない場合、または既存の定義済みカラムがビジネス要件を満たしていない場合は、定義済みカラムを追加または削除できます。Java 用 Tablestore SDK または Go 用 Tablestore SDK を使用して、定義済みカラムを管理できます。この例では、Java 用 Tablestore SDK を使用して、定義済みカラムの使用方法を説明します。

定義済みカラムを追加する

次のサンプルコードは、テーブルに定義済みカラムを追加する方法の例を示しています。この例では、definedColumnName01 (タイプ: STRING)、definedColumnName02 (タイプ: INTEGER)、definedColumnName03 (タイプ: STRING) の定義済みカラムが追加されます。

public static void addDefinedColumnRequest(SyncClient client) {
    AddDefinedColumnRequest addDefinedColumnRequest = new AddDefinedColumnRequest();
    // テーブルの名前を指定します。
    addDefinedColumnRequest.setTableName("<TABLE_NAME>");
    // テーブルに定義済みカラムを追加します。
    addDefinedColumnRequest.addDefinedColumn("definedColumnName01",DefinedColumnType.STRING);
    addDefinedColumnRequest.addDefinedColumn("definedColumnName02",DefinedColumnType.INTEGER);
    addDefinedColumnRequest.addDefinedColumn("definedColumnName03",DefinedColumnType.STRING);
    client.addDefinedColumn(addDefinedColumnRequest);
}

定義済みカラムを削除する

データテーブルから不要になった定義済みカラムを削除できます。

次のサンプルコードは、テーブルから definedColumnName01 および definedColumnName02 の定義済みカラムを削除する方法の例を示しています。

public static void deleteDefinedColumnRequest(SyncClient client){
    DeleteDefinedColumnRequest deleteDefinedColumnRequest = new DeleteDefinedColumnRequest();
    // テーブルの名前を指定します。
    deleteDefinedColumnRequest.setTableName("<TABLE_NAME>");
    // テーブルから定義済みカラムを削除します。
    deleteDefinedColumnRequest.addDefinedColumn("definedColumnName01");
    deleteDefinedColumnRequest.addDefinedColumn("definedColumnName02");
    client.deleteDefinedColumn(deleteDefinedColumnRequest);
}

ステップ 2: セカンダリインデックスを作成する

CreateIndex オペレーションを呼び出して、既存のデータテーブルのインデックステーブルを作成し、データクエリを高速化できます。セカンダリインデックスは、グローバルセカンダリインデックスとローカルセカンダリインデックスに分類されます。ビジネス要件に基づいて、グローバルまたはローカルセカンダリインデックスを作成できます。

説明

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

Java 用 Tablestore SDKGo 用 Tablestore SDKPython 用 Tablestore SDKNode.js 用 Tablestore SDK.NET 用 Tablestore SDK、または PHP 用 Tablestore SDK を使用して、セカンダリインデックスを作成できます。この例では、Java 用 Tablestore SDK を使用して、セカンダリインデックスの作成方法を説明します。

グローバルセカンダリインデックスを作成する

次のサンプルコードは、データテーブルのグローバルセカンダリインデックスを作成する方法の例を示しています。

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

ステップ 3: インデックステーブルからデータを読み取る

インデックステーブル内の単一のデータ行またはプライマリキー値が特定の範囲内にあるデータを読み取るときに、返したい属性カラムがインデックステーブルに含まれている場合は、インデックステーブルを読み取って必要なデータを取得できます。そうでない場合は、データテーブルを読み取って必要なデータを取得する必要があります。

Java 用 Tablestore SDKGo 用 Tablestore SDKPython 用 Tablestore SDKNode.js 用 Tablestore SDK.NET 用 Tablestore SDK、または PHP 用 Tablestore SDK を使用して、セカンダリインデックスからデータを読み取ることができます。この例では、Java 用 Tablestore SDK を使用して、セカンダリインデックスからデータを読み取る方法を説明します。

単一のデータ行を読み取る

次のサンプルコードは、データ行を読み取る方法の例を示しています。

次のサンプルコードは、インデックステーブルから行の特定の属性カラムを読み取る方法の例を示しています。

private static void getRowFromIndex(SyncClient client) {
    // プライマリキーを構築します。ローカルセカンダリインデックスからデータを読み取る場合、インデックステーブルの最初のプライマリキーカラムは、データテーブルの最初のプライマリキーカラムと同じである必要があります。
    PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    primaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.fromString("def1"));
    primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.fromLong(100));
    primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.fromString("pri1"));
    PrimaryKey primaryKey = primaryKeyBuilder.build();

    // データ行を読み取るインデックステーブルの名前と行のプライマリキーを指定します。
    SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("<INDEX_NAME>", primaryKey);
    // MaxVersions パラメータを 1 に設定して、最新バージョンのデータを読み取ります。
    criteria.setMaxVersions(1);
    GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
    Row row = getRowResponse.getRow();
    // 読み取る行が存在しない場合は、null が返されます。
    System.out.println("読み取り完了。結果:");
    System.out.println(row);

    // 読み取る属性カラムを指定します。
    criteria.addColumnsToGet("Col0");
    getRowResponse = client.getRow(new GetRowRequest(criteria));
    row = getRowResponse.getRow();
    
    System.out.println("読み取り完了。結果:");
    System.out.println(row);
} 

プライマリキー値が特定の範囲内にあるデータを読み取る

プライマリキー値が特定の範囲内にあるデータを読み取ることができます。

グローバルセカンダリインデックスを使用する

インデックステーブルに返したい属性カラムが含まれている場合は、インデックステーブルから必要なデータをクエリできます。

private static void scanFromIndex(SyncClient client) {
    // インデックステーブルの名前を指定します。
    RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("<INDEX_NAME>"); 

    // クエリする範囲の開始プライマリキーを指定します。
    PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // インデックスカラムの値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MIN); 
    // インデックステーブルでインデックスカラムとして指定されていないデータテーブルのプライマリキーカラムの値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MIN); 
    // インデックステーブルでインデックスカラムとして指定されていないデータテーブルのプライマリキーカラムの値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MIN); 
    rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());

    // クエリする範囲の終了プライマリキーを指定します。
    PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // インデックスカラムの値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MAX); 
    // インデックステーブルでインデックスカラムとして指定されていないデータテーブルのプライマリキーカラムの値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MAX); 
    // インデックステーブルでインデックスカラムとして指定されていないデータテーブルのプライマリキーカラムの値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX); 
    rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());

    rangeRowQueryCriteria.setMaxVersions(1);

    System.out.println("インデックステーブルから返された結果:");
    while (true) {
        GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
        for (Row row : getRangeResponse.getRows()) {
            System.out.println(row);
        }

        // レスポンスの nextStartPrimaryKey パラメータが null でない場合は、データの読み取りを続けます。
        if (getRangeResponse.getNextStartPrimaryKey() != null) {
            rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
        } else {
            break;
        }
    }
}

インデックステーブルに返したい属性カラムが含まれていない場合は、データテーブルから必要なデータをクエリする必要があります。

private static void scanFromIndex(SyncClient client) {
    // インデックステーブルの名前を指定します。
    RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("<INDEX_NAME>"); 

    // クエリする範囲の開始プライマリキーを指定します。
    PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // インデックスカラムの値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MIN); 
    // インデックステーブルでインデックスカラムとして指定されていないデータテーブルのプライマリキーカラムの値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MIN); 
    // インデックステーブルでインデックスカラムとして指定されていないデータテーブルのプライマリキーカラムの値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MIN); 
    rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());

    // クエリする範囲の終了プライマリキーを指定します。
    PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // インデックスカラムの値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MAX); 
    // インデックステーブルでインデックスカラムとして指定されていないデータテーブルのプライマリキーカラムの値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MAX); 
    // インデックステーブルでインデックスカラムとして指定されていないデータテーブルのプライマリキーカラムの値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX); 
    rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());

    rangeRowQueryCriteria.setMaxVersions(1);

    while (true) {
        GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
        for (Row row : getRangeResponse.getRows()) {
            PrimaryKey curIndexPrimaryKey = row.getPrimaryKey();
            PrimaryKeyColumn pk1 = curIndexPrimaryKey.getPrimaryKeyColumn(PRIMARY_KEY_NAME_1);
            PrimaryKeyColumn pk2 = curIndexPrimaryKey.getPrimaryKeyColumn(PRIMARY_KEY_NAME_2);
            PrimaryKeyBuilder mainTablePKBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
            mainTablePKBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, pk1.getValue());
            mainTablePKBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, pk2.getValue());
            // インデックステーブルのプライマリキーに基づいて、データテーブルのプライマリキーを指定します。
            PrimaryKey mainTablePK = mainTablePKBuilder.build(); 

            // データテーブルからデータをクエリします。
            SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("<TABLE_NAME>", mainTablePK);
            // 返す属性カラムを指定します。この例では、DEFINED_COL_NAME_3 カラムが返されます。
            criteria.addColumnsToGet(DEFINED_COL_NAME_3); 
            // MaxVersions パラメータを 1 に設定して、最新バージョンのデータを読み取ります。
            criteria.setMaxVersions(1);
            GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
            Row mainTableRow = getRowResponse.getRow();
            System.out.println(row); 
        }

        // レスポンスの nextStartPrimaryKey パラメータが null でない場合は、データの読み取りを続けます。
        if (getRangeResponse.getNextStartPrimaryKey() != null) {
            rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
        } else {
            break;
        }
    }
}

ローカルセカンダリインデックスを使用する

インデックステーブルに返したい属性カラムが含まれている場合は、インデックステーブルから必要なデータをクエリできます。

private static void scanFromIndex(SyncClient client) {
    // インデックステーブルの名前を指定します。
    RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("INDEX_NAME"); 

    // クエリする範囲の開始プライマリキーを指定します。
    PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // インデックスカラムの値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MIN); 
    // インデックスカラムの値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MIN); 
    // インデックステーブルでインデックスカラムとして指定されていないデータテーブルのプライマリキーカラムの値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MIN); 
    rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());

    // クエリする範囲の終了プライマリキーを指定します。
    PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // インデックスカラムの値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MAX);
    // インデックスカラムの値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MAX); 
    // インデックステーブルでインデックスカラムとして指定されていないデータテーブルのプライマリキーカラムの値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX); 
    rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());

    rangeRowQueryCriteria.setMaxVersions(1);

    System.out.println("インデックステーブルから返された結果:");
    while (true) {
        GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
        for (Row row : getRangeResponse.getRows()) {
            System.out.println(row);
        }

        // レスポンスの nextStartPrimaryKey パラメータが null でない場合は、データの読み取りを続けます。
        if (getRangeResponse.getNextStartPrimaryKey() != null) {
            rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
        } else {
            break;
        }
    }
}

インデックステーブルに返したい属性カラムが含まれていない場合は、データテーブルから必要なデータをクエリする必要があります。

private static void scanFromIndex(SyncClient client) {
    // インデックステーブルの名前を指定します。
    RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("<INDEX_NAME>"); 

    // クエリする範囲の開始プライマリキーを指定します。
    PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // インデックスカラムの値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MIN); 
    // インデックスカラムの値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MIN); 
    // インデックステーブルでインデックスカラムとして指定されていないデータテーブルのプライマリキーカラムの値を無限小の値に設定します。
    startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MIN); 
    rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());

    // クエリする範囲の終了プライマリキーを指定します。
    PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
    // インデックスカラムの値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MAX); 
    // インデックスカラムの値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MAX); 
    // インデックステーブルでインデックスカラムとして指定されていないデータテーブルのプライマリキーカラムの値を無限大の値に設定します。
    endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX); 
    rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());

    rangeRowQueryCriteria.setMaxVersions(1);

    while (true) {
        GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
        for (Row row : getRangeResponse.getRows()) {
            PrimaryKey curIndexPrimaryKey = row.getPrimaryKey();
            PrimaryKeyColumn pk1 = curIndexPrimaryKey.getPrimaryKeyColumn(PRIMARY_KEY_NAME_1);
            PrimaryKeyColumn pk2 = curIndexPrimaryKey.getPrimaryKeyColumn(PRIMARY_KEY_NAME_2);
            PrimaryKeyBuilder mainTablePKBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
            mainTablePKBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, pk1.getValue());
            mainTablePKBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, pk2.getValue());
            // インデックステーブルのプライマリキーに基づいて、データテーブルのプライマリキーを指定します。
            PrimaryKey mainTablePK = mainTablePKBuilder.build(); 

            // データテーブルからデータをクエリします。
            SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("TABLE_NAME", mainTablePK);
            // データテーブルから返す属性カラムを指定します。この例では、DEFINED_COL_NAME3 カラムが返されます。
            criteria.addColumnsToGet(DEFINED_COL_NAME3); 
            // MaxVersions パラメータを 1 に設定して、最新バージョンのデータを読み取ります。
            criteria.setMaxVersions(1);
            GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
            Row mainTableRow = getRowResponse.getRow();
            System.out.println(row); 
        }

        // レスポンスの nextStartPrimaryKey パラメータが null でない場合は、データの読み取りを続けます。
        if (getRangeResponse.getNextStartPrimaryKey() != null) {
            rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
        } else {
            break;
        }
    }
}

付録: インデックステーブルを削除する

このセクションでは、不要になったインデックステーブルを削除する方法について説明します。

Java 用 Tablestore SDKGo 用 Tablestore SDKPython 用 Tablestore SDKNode.js 用 Tablestore SDK.NET 用 Tablestore SDK、または PHP 用 Tablestore SDK を使用して、セカンダリインデックスを削除できます。この例では、Java 用 Tablestore SDK を使用して、セカンダリインデックスの削除方法を説明します。

次のサンプルコードは、セカンダリインデックスを削除する方法の例を示しています。

private static void deleteIndex(SyncClient client) {
    // データテーブルとセカンダリインデックスの名前を指定します。
    DeleteIndexRequest request = new DeleteIndexRequest("<TABLE_NAME>", "<INDEX_NAME>"); 
    // セカンダリインデックスを削除します。
    client.deleteIndex(request); 
}

FAQ

参考資料

  • Tablestore コンソールまたは Tablestore CLI でセカンダリインデックスを使用できます。詳細については、Tablestore コンソールでセカンダリインデックスを使用する および セカンダリインデックス を参照してください。

  • より効率的かつ柔軟な方法でデータをクエリする場合は、検索インデックス機能を使用できます。検索インデックス機能は、ブールクエリ、全文検索、プレフィックスクエリ、あいまいクエリなど、複数のクエリメソッドを提供します。詳細については、概要 を参照してください。