创建二级索引

更新时间:
复制 MD 格式

使用 Java SDK 为已有数据表创建全局二级索引或本地二级索引。

前提条件

  • 安装Tablestore Java SDK并初始化客户端。

  • 目标数据表的最大版本数为 1,并且数据生命周期为 -1,或者已禁止通过 UpdateRow 更新数据。

  • 如果将非主键列作为索引列或属性列,已将这些列设置为预定义列。

功能说明

二级索引通过重新组合数据表的主键列和预定义列,为数据表提供不同于原主键的查询维度。二级索引分为全局二级索引和本地二级索引,两种索引的数据同步方式和主键要求不同。更多信息,请参见二级索引

调用 createIndex 为已有数据表创建二级索引。如果需要在创建数据表时同时创建一个或多个二级索引,可在 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);

参数说明

CreateIndexRequest 包含以下参数:

名称

类型

说明

mainTableName(必选)

String

数据表名称。

indexMeta(必选)

IndexMeta

索引表的结构信息。

includeBaseData(必选)

boolean

索引表是否包含数据表中的存量数据。设置为 true 时同步存量数据,同步时间随数据量变化;设置为 false 时仅同步创建索引后写入的数据。

索引结构

indexMeta 的类型为 IndexMeta,包含以下参数:

名称

类型

说明

indexName(必选)

String

索引表名称,不能与已有的数据表或时序表名称相同。

primaryKey(必选)

List<String>

索引列名称的有序列表,可以包含数据表主键列和预定义列,需指定 1~4 列。系统按照添加顺序设置索引表主键,并将未指定为索引列的数据表主键自动补充到索引表主键的末尾。创建本地二级索引时,第一列索引主键必须与数据表的第一列主键相同。

definedColumns(可选)

List<String>

索引表的属性列名称列表,只能包含数据表的预定义列。

indexType(可选)

IndexType

索引类型。取值为 IT_GLOBAL_INDEXIT_LOCAL_INDEX,默认值为 IT_GLOBAL_INDEX

indexUpdateMode(可选)

IndexUpdateMode

索引更新模式。全局二级索引必须使用 IUM_ASYNC_INDEX,系统以异步方式同步索引列和主键列的数据,正常情况下同步延迟为毫秒级;本地二级索引必须使用 IUM_SYNC_INDEX,系统以同步方式更新索引,数据写入数据表后即可从索引表中查询。默认值为 IUM_ASYNC_INDEX

场景示例

创建本地二级索引

创建本地二级索引时,将数据表的第一列主键作为第一列索引主键,并将索引类型和更新模式分别设置为 IT_LOCAL_INDEXIUM_SYNC_INDEX

IndexMeta indexMeta = new IndexMeta("example_local_index");
indexMeta.addPrimaryKeyColumn("user_id");
indexMeta.addPrimaryKeyColumn("category");
indexMeta.addDefinedColumn("status");
indexMeta.setIndexType(IndexType.IT_LOCAL_INDEX);
indexMeta.setIndexUpdateMode(IndexUpdateMode.IUM_SYNC_INDEX);

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