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

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

最終更新日:Dec 28, 2024

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

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

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

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 CreateGLocalIndexSample(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) // インデックスの作成が完了しました
    }
}

関連情報