创建二级索引

二级索引相当于把数据表的主键查询能力扩展到了不同的列,当需要使用属性查询数据时,您可以通过创建二级索引加快数据查询的效率。设置预定义列后,在创建二级索引时将预定义列作为索引表的索引列或者属性列。您可以使用CreateIndex接口在已存在的数据表上创建一个索引表。

说明
  • 二级索引包括全局二级索引和本地二级索引。关于二级索引的更多信息,请参见二级索引

  • 您也可以使用CreateTable接口在创建数据表的同时创建一个或者多个索引表。具体操作,请参见创建数据表

前提条件

  • 已初始化Client。具体操作,请参见初始化OTSClient

  • 已创建数据表,且数据表的最大版本数(maxVersions)必须为1,数据生命周期(timeToLive)必须满足如下条件中的任意一个。

    • 数据表的数据生命周期为-1(数据永不过期)。

    • 数据表的数据生命周期不为-1时,数据表为禁止更新状态。

  • 数据表已设置预定义列。

注意事项

  • 索引表名称不能与已存在的时序表名称和数据表名称相同。

  • 创建二级索引时,系统会自动将未出现在索引列中的数据表主键补齐到索引表主键中。

  • 创建本地二级索引时,索引表的第一列主键必须与数据表的第一列主键相同。

参数

参数

说明

mainTableName

数据表名称。

indexMeta

索引表的结构信息,包括如下内容:

  • indexName:索引表名称。

  • primaryKey:索引表的索引列,索引列为数据表主键和预定义列的组合。

    使用本地二级索引时,索引表的第一个主键列必须与数据表的第一个主键列相同。

  • definedColumns:索引表的属性列,索引表属性列为数据表的预定义列的组合。

  • indexType:索引类型。可选值包括IT_GLOBAL_INDEXIT_LOCAL_INDEX。

    • 当不设置indexType或者设置indexTypeIT_GLOBAL_INDEX时,表示使用全局二级索引。

      使用全局索引时,表格存储以异步方式将数据表中被索引的列和主键列的数据自动同步到索引表中,正常情况下同步延迟达到毫秒级别。

    • 当设置indexTypeIT_LOCAL_INDEX时,表示使用本地二级索引。

      使用本地二级索引时,表格存储以同步方式将数据表中被索引的列和主键列的数据自动同步到索引表中,当数据写入数据表后,即可从索引表中查询到数据。

  • indexUpdateMode:索引更新模式。可选值包括IUM_ASYNC_INDEXIUM_SYNC_INDEX。

    • 当不设置indexUpdateMode或者设置indexUpdateModeIUM_ASYNC_INDEX时,表示异步更新。

      使用全局二级索引时,索引更新模式必须设置为异步更新(IUM_ASYNC_INDEX)。

    • 当设置indexUpdateModeIUM_SYNC_INDEX时,表示同步更新。

      使用本地二级索引时,索引更新模式必须设置为同步更新(IUM_SYNC_INDEX)。

includeBaseData

索引表中是否包含数据表中已存在的数据。

CreateIndexRequest中的最后一个参数includeBaseData设置为true时,表示包含存量数据;设置为false时,表示不包含存量数据。

示例

创建全局二级索引

以下示例用于为数据表创建一个全局二级索引。

private static void createIndex(SyncClient client) {
    //设置索引表名称。
    IndexMeta indexMeta = new IndexMeta("<INDEX_NAME>"); 
    //为索引表添加主键列,设置DEFINED_COL_NAME_1列为索引表的第一列主键。
    indexMeta.addPrimaryKeyColumn(DEFINED_COL_NAME_1); 
    //为索引表添加主键列,设置PRIMARY_KEY_NAME_2列为索引表的第二列主键。
    indexMeta.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2); 
    //为索引表添加属性列,设置DEFINED_COL_NAME_2列为索引表的属性列。
    indexMeta.addDefinedColumn(DEFINED_COL_NAME_2); 
    //添加索引表到数据表,包含存量数据。
    //CreateIndexRequest request = new CreateIndexRequest("<TABLE_NAME>", indexMeta, true); 
    //添加索引表到数据表,不包含存量数据。
    CreateIndexRequest request = new CreateIndexRequest("<TABLE_NAME>", indexMeta, false); 
    /**通过将IncludeBaseData参数设置为true,创建索引表后会开启数据表中存量数据的同步,然后可以通过索引表查询全部数据,
       同步时间和数据量的大小有一定的关系。
    */
    //request.setIncludeBaseData(true);
    //创建索引表。
    client.createIndex(request); 
}

创建本地二级索引

以下示例用于创建一个本地二级索引。

private static void createIndex(SyncClient client) {
    //设置索引表名称。
    IndexMeta indexMeta = new IndexMeta("<INDEX_NAME>"); 
    //为索引表添加主键列,设置PRIMARY_KEY_NAME_1列为索引表的第一列主键。
    //本地二级索引的第一列主键必须与数据表的第一列主键相同。
    indexMeta.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1); 
    //为索引表添加主键列,设置DEFINED_COL_NAME_1列为索引表的第二列主键。
    indexMeta.addPrimaryKeyColumn(DEFINED_COL_NAME_1); 
    //为索引表添加属性列,设置DEFINED_COL_NAME_2列为索引表的属性列。
    indexMeta.addDefinedColumn(DEFINED_COL_NAME_2); 
    //设置索引类型为IT_LOCAL_INDEX(本地二级索引)。
    indexMeta.setIndexType(IT_LOCAL_INDEX);
    //设置同步模式为IUM_SYNC_INDEX(同步更新)。
    indexMeta.setIndexUpdateMode(IUM_SYNC_INDEX);
    //添加索引表到数据表,包含存量数据。
    //CreateIndexRequest request = new CreateIndexRequest("<TABLE_NAME>", indexMeta, true); 
    //添加索引表到数据表,不包含存量数据。
    CreateIndexRequest request = new CreateIndexRequest("<TABLE_NAME>", indexMeta, false); 
    /**通过将IncludeBaseData参数设置为true,创建索引表后会开启数据表中存量数据的同步,然后可以通过索引表查询全部数据,
       同步时间和数据量的大小有一定的关系。
    */
    //request.setIncludeBaseData(true);
    //创建索引表。
    client.createIndex(request); 
}

相关文档

  • 创建二级索引后,您可以单行读取或者范围读取数据。具体操作,请参见使用二级索引读取数据

  • 如果不再需要使用二级索引,您可以删除二级索引。具体操作,请参见删除二级索引