セカンダリインデックス機能を使用すると、データテーブルのプライマリキーと、データテーブルに作成されたセカンダリインデックスのインデックスカラムに基づいてデータをクエリできます。データテーブルの属性カラムを使用してデータをクエリする必要がある場合は、データテーブルのセカンダリインデックスを作成してデータクエリを高速化できます。データテーブルのセカンダリインデックスを作成するときは、セカンダリインデックスのインデックスカラムまたは属性カラムを、データテーブルの作成時に指定した事前定義カラムに設定できます。
セカンダリインデックスは、グローバルセカンダリインデックスとローカルセカンダリインデックスに分類されます。セカンダリインデックス機能の詳細については、セカンダリインデックスを参照してください。
CreateTableオペレーションを呼び出すことで、データテーブルを作成するときに1つ以上のインデックステーブルを作成できます。詳細については、データテーブルを作成するを参照してください。
前提条件
OTSClientインスタンスが初期化されていること。詳細については、OTSClientインスタンスを初期化するを参照してください。
MaxVersionsパラメータが1に設定されたデータテーブルが作成されていること。データテーブルのTimeToLiveパラメータは、次のいずれかの条件を満たしている必要があります。
データテーブルのTimeToLiveパラメータが-1に設定されていること。これは、データテーブルのデータが期限切れにならないことを意味します。
データテーブルのTimeToLiveパラメータが-1以外の値に設定されており、データテーブルの更新操作が禁止されていること。
データテーブルに事前定義カラムが指定されていること。
使用上の注意
インデックステーブルの名前は、既存の時系列テーブルまたはデータテーブルの名前と異なる必要があります。
セカンダリインデックスを作成すると、Tablestoreは、インデックスカラムとして指定されていないデータテーブルのプライマリキーカラムを、セカンダリインデックスのプライマリキーカラムとしてセカンダリインデックスに自動的に追加します。
ローカルセカンダリインデックスを作成する場合、インデックステーブルの最初のプライマリキーカラムは、データテーブルの最初のプライマリキーカラムと同じである必要があります。
パラメータ
パラメータ | 説明 |
MainTableName | データテーブルの名前。 |
IndexMeta | インデックステーブルに関するスキーマ情報。スキーマ情報には、次の項目が含まれます。
|
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) // インデックスの作成が完了しました
}
}
関連情報
セカンダリインデックスを作成した後、セカンダリインデックスを使用して、1行のデータ、またはプライマリキー値が特定の範囲内にあるデータを読み取ることができます。詳細については、セカンダリインデックスを使用してデータを読み取るを参照してください。
不要になったセカンダリインデックスを削除できます。詳細については、セカンダリインデックスを削除するを参照してください。