数据生命周期(Time To Live,简称TTL)是多元索引的一个属性,即数据的保存时间。多元索引会自动清理超过保存时间的数据,减少用户的数据存储空间,降低存储成本。

注意 多元索引生命周期功能目前正处于邀测阶段,您可以通过钉钉加入用户群11789671(表格存储技术交流群)或23307953(表格存储技术交流群-2)联系“表格存储技术支持”进行开通和使用。

注意事项

  • 使用多元索引生命周期功能,必须禁用数据表的Update更新写入功能,避免一些语义上的问题:

    由于数据表TTL是属性列级别生效的,而多元索引TTL是整行生效的,如果存在Update写入操作,当系统清理数据表中数据时,数据表中部分字段值已删除而部分字段值未删除,但是多元索引中整行数据均未删除,则会造成数据表和多元索引中的数据不一致。

    如果业务有Update更新写入操作,请查看是否能改为Put覆盖写入操作。

  • 多元索引的TTL取值范围为-1或者int32的正整数(单位为秒),其中-1表示永久存储,int32最大值换算为年大约为68年。
  • 多元索引的TTL值必须小于或等于数据表的TTL值。当需要同时调小多元索引TTL和数据表TTL时,请先调整多元索引TTL,再调整数据表TTL。
  • 多元索引每天会自动清理已过期的数据,过期数据的清理粒度为“天”,因此您仍然可以查询到某一时刻已过期但是还未及时清理的数据,多元索引会在下一次清理过期数据时自动清理这些过期数据。
  • 数据表和多元索引的TTL更新后,系统会在下一次清理过期数据时自动清理数据表和多元索引中的存量过期数据。

使用流程

  1. 禁用数据表Update更新写入操作。
    public void disableTableUpdate() {
        UpdateTableRequest updateTableRequest = new UpdateTableRequest(tableName);
        TableOptions options = new TableOptions();
        // 禁用数据表Update更新写入操作,请确保数据表无Update写入操作,避免影响业务。
        options.setAllowUpdate(false);
        updateTableRequest.setTableOptionsForUpdate(options);
        client.updateTable(updateTableRequest);
    }
  2. 设置多元索引生命周期。

    禁用数据表Update更新写入操作后,您可以在创建多元索引时指定TTL或者为已有多元索引指定TTL。

    • 创建多元索引时指定TTL
      // 请使用5.12.0及以上版本的Java SDK。
      public void createIndexWithTTL() {
          int days = 7;
          CreateSearchIndexRequest createRequest = new CreateSearchIndexRequest();
          createRequest.setTableName(tableName);
          createRequest.setIndexName(indexName);
          createRequest.setIndexSchema(indexSchema);
          // 设置多元索引TTL。
          createRequest.setTimeToLiveInDays(days);
          client.createSearchIndex(createRequest);
      }
    • 为已有多元索引指定TTL
      // 请使用5.12.0及以上版本的Java SDK。
      public void updateIndexWithTTL() {
          int days = 7;
          UpdateSearchIndexRequest updateSearchIndexRequest = new UpdateSearchIndexRequest(tableName, indexName);
          // 更新多元索引TTL。
          updateSearchIndexRequest.setTimeToLiveInDays(days);
          client.updateSearchIndex(updateSearchIndexRequest);
      }