セカンダリインデックス機能を使用すると、データテーブルのプライマリキーと、データテーブル用に作成されたセカンダリインデックスのインデックス列に基づいてデータをクエリできます。データテーブルの属性列を使用してデータをクエリする必要がある場合は、データテーブルのセカンダリインデックスを作成することで、データクエリを高速化できます。データテーブルのセカンダリインデックスを作成する際、セカンダリインデックスのインデックス列または属性列を、データテーブルの作成時に指定した事前定義列に設定できます。
-
セカンダリインデックスは、グローバルセカンダリインデックスとローカルセカンダリインデックスに分類されます。セカンダリインデックス機能の詳細については、「セカンダリインデックス」をご参照ください。
-
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 |
インデックステーブルのスキーマ情報。スキーマ情報には次の項目が含まれます。
|
|
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)
}
}
関連ドキュメント
-
セカンダリインデックスを作成した後、セカンダリインデックスを使用して、単一行のデータまたはプライマリキー値が特定の範囲内にあるデータを読み取ることができます。詳細については、「セカンダリインデックスを使用したデータの読み取り」をご参照ください。
-
不要になったセカンダリインデックスは削除できます。詳細については、「セカンダリインデックスの削除」をご参照ください。