在数据表上创建索引表后,可根据需要读取索引表中的数据或者删除数据表上指定的索引表。

前提条件

  • 已初始化Client。具体操作,请参见初始化
  • 已创建数据表,且数据表的最大版本数(maxVersions)必须为1,数据生命周期(timeToLive)必须满足如下条件中的任意一个。
    • 数据表的数据生命周期为-1(数据永不过期)。
    • 数据表的数据生命周期不为-1时,数据表为禁止更新状态。
  • 数据表已设置预定义列。

创建索引表(CreateIndex)

使用CreateIndex接口在已存在的数据表上创建索引表。
说明 您也可以使用CreateTable接口在创建数据表的同时创建一个或者多个索引表。具体操作,请参见创建数据表
  • 参数
    参数说明
    mainTableName数据表名称。
    indexMeta 索引表的结构信息,包括如下内容:
    • name:索引表名称。
    • primaryKey:索引表的索引列,索引列为数据表主键和预定义列的组合。

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

    • definedColumn:索引表的属性列,索引表属性列为数据表的预定义列的组合。
    • includeBaseData:索引表中是否包含数据表中已存在的数据。

      当设置includeBaseData为true时,表示包含存量数据;设置includeBaseData为false时,表示不包含存量数据。

    • indexType:索引类型。可选值包括IT_GLOBAL_INDEX和IT_LOCAL_INDEX。
      • 当不设置indexType或者设置indexType为IT_GLOBAL_INDEX时,表示使用全局二级索引。

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

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

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

    • indexUpdateMode:索引更新模式。可选值包括IUM_ASYNC_INDEX和IUM_SYNC_INDEX。
      • 当不设置indexUpdateMode或者设置indexUpdateMode为IUM_ASYNC_INDEX时,表示异步更新。

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

      • 当设置indexUpdateMode为IUM_SYNC_INDEX时,表示同步更新。

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

  • 示例
    var client = require('./client');
    var TableStore = require('../index.js');
    
    client.createIndex({
        mainTableName: "sdkGlobalIndexTest",
        indexMeta: {
            name: "sdkGlobalIndex",
            primaryKey: ["col1"],
            definedColumn: ["col2"],
            includeBaseData: false,
            indexUpdateMode: TableStore.IndexUpdateMode.IUM_ASYNC_INDEX,//索引更新模式默认为异步更新(IUM_ASYNC_INDEX)。
            indexType: TableStore.IndexType.IT_GLOBAL_INDEX,//索引类型默认为全局二级索引(IT_GLOBAL_INDEX)。
        }
    }, function (err, data) {
        if (err) {
            console.log('error:', err);
            return;
        }
        console.log('success:', JSON.stringify(data, null, 2));
    });

读取索引表中数据

从索引表中单行或者范围读取数据,当返回的属性列在索引表中时,可以直接读取索引表获取数据,否则请自行反查数据表获取数据。

  • 单行读取索引表中数据

    更多信息,请参见读取单行数据

    • 参数
      使用GetRow接口读取索引表中数据时有如下注意事项:
      • tableName需要设置为索引表名称。
      • 由于系统会自动将未出现在索引列中的数据表主键补齐到索引表主键中,所以设置行的主键时,需要同时设置索引表索引列和补齐的数据表主键。
    • 示例
      var TableStore = require('../index.js');
      var Long = TableStore.Long;
      var client = require('./client');
      
      var params = {
        tableName: "index1",
        primaryKey: [ {'pk2': Long.fromNumber(2)}, {'pk1': Long.fromNumber(1)}]
      };
      
      client.getRow(params, function (err, data) {
        if (err) {
          console.log('error:', err);
          return;
        }
        console.log('success:', JSON.stringify(data, null, 2));
      });
  • 范围读索引表中数据

    更多信息,请参见范围读取数据

    • 参数
      使用GetRange接口读取索引表中数据时有如下注意事项:
      • tableName需要设置为索引表名称。
      • 由于系统会自动将未出现在索引列中的数据表主键补齐到索引表主键中,所以设置起始主键和结束主键时,需要同时设置索引表索引列和补齐的数据表主键。
    • 示例
      var TableStore = require('../index.js');
      var Long = TableStore.Long;
      var client = require('./client');
      
      var params = {
        tableName: "sdkIndex1", //假定pk2是索引表的第一个主键列,pk1是索引表的第二个主键列。
        direction: TableStore.Direction.FORWARD,
        maxVersions: 10,
        inclusiveStartPrimaryKey: [{ "pk2": TableStore.INF_MIN }, { "pk1": TableStore.INF_MIN }],
        exclusiveEndPrimaryKey: [{ "pk2": TableStore.INF_MAX }, { "pk1": TableStore.INF_MAX }],
        limit: 2
      };
      
      var resultRows = []
      
      var getRange = function () {
        client.getRange(params, function (err, data) {
          if (err) {
            console.log('error:', err);
            return;
          }
          resultRows = resultRows.concat(data.rows)
      
          //如果data.next_start_primary_key不为空,则继续读取。
          if (data.nextStartPrimaryKey) {
            params.inclusiveStartPrimaryKey = [
              { "pk2": data.nextStartPrimaryKey[0].value },
              { "pk1": data.nextStartPrimaryKey[1].value }
            ];
            getRange()
          } else {
            console.log(JSON.stringify(resultRows));
          }
        });
      }
      
      getRange()

删除索引表(DeleteIndex)

使用DeleteIndex接口删除数据表上指定的索引表。

  • 参数
    参数说明
    mainTableName数据表名称。
    indexName索引表名称。
  • 示例
    var client = require('./client');
    
    client.dropIndex({
      mainTableName: "sdkGlobalTest",
      indexName: "sdkIndex1"
    }, function (err, data) {
      if (err) {
        console.log('error:', err);
        return;
      }
      console.log('success:', JSON.stringify(data, null, 2));
    });