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

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

最終更新日:Sep 30, 2026

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

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

  • CreateTable API を呼び出してデータテーブルを作成する際に、1 つ以上のインデックステーブルを作成できます。詳細については、「テーブルの作成」をご参照ください。

前提条件

  • OTSClient インスタンスが初期化されていること。詳細については、「Tablestore クライアントの初期化」をご参照ください。

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

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

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

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

説明

セカンダリインデックスは、データテーブルのプライマリキー列と事前定義列で構成される異なるプライマリキースキーマを使用して、追加のクエリディメンションを提供します。セカンダリインデックスは、グローバルセカンダリインデックスとローカルセカンダリインデックスに分類されます。この 2 種類のインデックスは、データ同期モードとプライマリキーの要件が異なります。詳細については、「概要」をご参照ください。

既存のデータテーブルにセカンダリインデックスを作成するには、createIndex を呼び出します。データテーブルと同時に 1 つ以上のセカンダリインデックスを作成するには、createTable リクエストでインデックススキーマを設定します。詳細については、「データテーブルの作成」をご参照ください。

public CreateIndexResponse createIndex(CreateIndexRequest createIndexRequest)
        throws TableStoreException, ClientException

次のサンプルコードでは、example_table にグローバルセカンダリインデックス example_global_index を作成します。このインデックスには既存のデータが含まれます。

IndexMeta indexMeta = new IndexMeta("example_global_index");
indexMeta.addPrimaryKeyColumn("category");
indexMeta.addDefinedColumn("status");

CreateIndexRequest request =
        new CreateIndexRequest("example_table", indexMeta, true);
client.createIndex(request);

パラメーター

パラメーター

説明

MainTableName

データテーブルの名前。

IndexMeta

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

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

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

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

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

  • IndexType:インデックステーブルのタイプ。有効な値は IT_GLOBAL_INDEX と IT_LOCAL_INDEX です。

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

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

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

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

IncludeBaseData

データテーブルの既存データをインデックステーブルに含めるかどうかを指定します。

IncludeBaseData パラメーターを true に設定すると、インデックステーブルにデータテーブルの既存データが含まれます。IncludeBaseData パラメーターを false に設定すると、インデックステーブルにデータテーブルの既存データは含まれません。

例

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

次のサンプルコードでは、データテーブルの既存データを含むグローバルセカンダリインデックスを作成する方法を説明します。この例では、データテーブルのプライマリキー列は pk1 と pk2 です。グローバルセカンダリインデックスのプライマリキー列は definedcol1、属性列は definedcol2 です。インデックステーブルのプライマリキー列は、definedcol1、pk1、pk2 で構成されます。インデックステーブルの属性列は definedcol2 です。

func CreateGlobalIndexSample(client *tablestore.TableStoreClient, tableName string) {
    // インデックステーブルのメタデータを指定します。
    indexMeta := new(tablestore.IndexMeta) 
    // データテーブルの definedcol1 列をインデックステーブルのプライマリキー列として指定します。
    indexMeta.AddPrimaryKeyColumn("definedcol1") 
    // データテーブルの definedcol2 列をインデックステーブルの属性列として指定します。
    indexMeta.AddDefinedColumn("definedcol2") 
    // インデックステーブルの名前を指定します。
    indexMeta.IndexName = "<INDEX_NAME>"
    indexReq := &tablestore.CreateIndexRequest{
        // インデックスを作成するデータテーブル名とインデックスのメタデータを指定します。
        MainTableName:tableName, 
        IndexMeta: indexMeta,
        /**
          IncludeBaseData パラメーターを true に設定すると、データテーブルの既存データをインデックステーブルに同期できます。これにより、インデックステーブルを使用してデータテーブル内のすべてのデータをクエリできます。
          データテーブルの既存データをインデックステーブルに同期するために必要な時間は、データテーブル内のデータ量によって異なります。
        */ 
        IncludeBaseData: true, 
    }
     
    resp, err := client.CreateIndex(indexReq)
    if err != nil {
        fmt.Println("Failed to create table with error:", err)
    } else {
        fmt.Println("Create index finished", resp)
    }
}

ローカルセカンダリインデックスの作成

次のサンプルコードでは、データテーブルの既存データを含むローカルセカンダリインデックスを作成する方法を説明します。この例では、データテーブルのプライマリキー列は pk1 と pk2 です。ローカルセカンダリインデックスのプライマリキー列は pk1 と definedcol1 です。ローカルセカンダリインデックスの属性列は definedcol2 です。インデックステーブルのプライマリキー列は、pk1、definedcol1、pk2 で構成されます。インデックステーブルの属性列は definedcol2 です。

func CreateLocalIndexSample(client *tablestore.TableStoreClient, tableName string) {
    // インデックステーブルのメタデータを指定します。
    indexMeta := new(tablestore.IndexMeta) 
    // インデックステーブルの最初のプライマリキー列を、データテーブルの最初のプライマリキー列に設定します。
    indexMeta.AddPrimaryKeyColumn("pk1") 
    // データテーブルの definedcol1 列をインデックステーブルのプライマリキー列として指定します。
    indexMeta.AddPrimaryKeyColumn("definedcol1") 
    // データテーブルの definedcol2 列をインデックステーブルの属性列として指定します。
    indexMeta.AddDefinedColumn("definedcol2") 
    // インデックスタイプを IT_LOCAL_INDEX に設定します。
    indexMeta.IndexType = tablestore.IT_LOCAL_INDEX 
    // インデックステーブルの名前を指定します。
    indexMeta.IndexName = "<INDEX_NAME>"
    indexReq := &tablestore.CreateIndexRequest{
        // インデックスを作成するデータテーブル名とインデックスのメタデータを指定します。
        MainTableName:tableName, 
        IndexMeta: indexMeta,
        /**
          IncludeBaseData パラメーターを true に設定すると、データテーブルの既存データをインデックステーブルに同期できます。これにより、インデックステーブルを使用してデータテーブル内のすべてのデータをクエリできます。
          データテーブルの既存データをインデックステーブルに同期するために必要な時間は、データテーブル内のデータ量によって異なります。
        */
        IncludeBaseData: true, 
    }
      
    resp, err := client.CreateIndex(indexReq)
    if err != nil {
        fmt.Println("Failed to create table with error:", err)
    } else {
        fmt.Println("Create index finished", resp)
    }
}

関連ドキュメント