在資料表上建立索引表後,可根據需要讀取索引表中的資料或者刪除資料表上指定的索引表。

使用

您可以使用如下語言的SDK實現本地二級索引功能。

建立索引表(CreateIndex)

使用CreateIndex介面在已存在的資料表上建立一個索引表。
说明 您也可以使用CreateTable介面在建立資料表的同時建立一個或者多個索引表。具體操作,請參見建立資料表
  • 參數
    參數說明
    mainTableName資料表名稱。
    indexMeta 索引表的結構資訊,包括如下內容:
    • indexName:索引表名稱。
    • primaryKey:索引表的索引列,索引列為資料表主鍵和預定義列的組合。

      使用本地二級索引時,索引表的第一個主鍵列必須與資料表的第一個主鍵列相同。

    • definedColumns:索引表的屬性列,索引表屬性列為資料表的預定義列的組合。
    • indexType:索引類型。可選值包括IT_GLOBAL_INDEX和IT_LOCAL_INDEX。
      • 當不設定indexType或者設定indexType為IT_GLOBAL_INDEX時,表示使用全域二級索引。

        使用全域索引時,Table Store以非同步方式將資料表中被索引的列和主鍵列的資料自動同步到索引表中,正常情況下同步延遲達到毫秒層級。

      • 當設定indexType為IT_LOCAL_INDEX時,表示使用本地二級索引。

        使用本地二級索引時,Table Store以同步方式將資料表中被索引的列和主鍵列的資料自動同步到索引表中,當資料寫入資料表後,即可從索引表中查詢到資料。

    • indexUpdateMode:索引更新模式。可選值包括IUM_ASYNC_INDEX和IUM_SYNC_INDEX。
      • 當不設定indexUpdateMode或者設定indexUpdateMode為IUM_ASYNC_INDEX時,表示非同步更新。

        使用全域二級索引時,索引更新模式必須設定為非同步更新(IUM_ASYNC_INDEX)。

      • 當設定indexUpdateMode為IUM_SYNC_INDEX時,表示同步更新。

        使用本地二級索引時,索引更新模式必須設定為同步更新(IUM_SYNC_INDEX)。

    includeBaseData索引表中是否包含資料表中已存在的資料。

    當CreateIndexRequest中的最後一個參數includeBaseData設定為true時,表示包含存量資料;設定為false時,表示不包含存量資料。

  • 樣本
    private static void createIndex(SyncClient client) {
        IndexMeta indexMeta = new IndexMeta(INDEX_NAME); //設定索引表名稱。
        indexMeta.setIndexType(IT_LOCAL_INDEX);     //設定索引類型為本地二級索引(IT_LOCAL_INDEX)。
        indexMeta.setIndexUpdateMode(IUM_SYNC_INDEX);  //設定索引更新模式為同步更新(IUM_SYNC_INDEX)。當索引類型為本地二級索引時,索引更新模式必須為同步更新。
      
        indexMeta.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1); //為索引表添加主鍵列。索引表的第一列主鍵必須與資料表的第一列主鍵相同。
        indexMeta.addPrimaryKeyColumn(DEFINED_COL_NAME_2); //為索引表添加主鍵列,設定DEFINED_COL_NAME_2列為索引表的第二列主鍵。
        indexMeta.addPrimaryKeyColumn(DEFINED_COL_NAME_1); //為索引表添加主鍵列,設定DEFINED_COL_NAME_1列為索引表的第三列主鍵。
        //CreateIndexRequest request = new CreateIndexRequest(TABLE_NAME, indexMeta, true); //添加索引表到資料表,包含存量資料。
        CreateIndexRequest request = new CreateIndexRequest(TABLE_NAME, indexMeta, false); //添加索引表到資料表,不包含存量資料。
        /**通過將IncludeBaseData參數設定為true,建立索引表後會開啟資料表中存量資料的同步,然後可以通過索引表查詢全部資料,
           同步時間和資料量的大小有一定的關係。
        */
        //request.setIncludeBaseData(true);
        client.createIndex(request); // 建立索引表。
    }

讀取索引表中資料

從索引表中單行或者範圍讀取資料,當返回的屬性列在索引表中時,可以直接讀取索引表擷取資料,否則請自行反查資料表擷取資料。

  • 單行讀取索引表中資料

    更多資訊,請參見讀取單行資料

    使用GetRow介面讀取索引表中資料時有如下注意事項:
    • tableName需要設定為索引表名稱。
    • 由於系統會自動將未出現在索引列中的資料表主鍵補齊到索引表主鍵中,所以設定行的主鍵時,需要同時設定索引表索引列和補齊的資料表主鍵。
  • 範圍讀索引表中資料

    更多資訊,請參見範圍讀取資料

    • 參數
      使用GetRange介面讀取索引表中資料時有如下注意事項:
      • tableName需要設定為索引表名稱。
      • 由於系統會自動將未出現在索引列中的資料表主鍵補齊到索引表主鍵中,所以設定起始主鍵和結束主鍵時,需要同時設定索引表索引列和補齊的資料表主鍵。
    • 樣本
      當需要返回的屬性列在索引表中時,可以直接讀取索引表擷取資料。
      private static void scanFromIndex(SyncClient client) {
          RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria(INDEX_NAME); //設定索引表名稱。
      
          //設定起始主鍵。
          PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
          startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MIN); //設定需要讀取的索引列最小值。
          startPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MIN); //設定需要讀取的索引列最小值。
          startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MIN); //設定資料表主鍵最小值。
          rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());
      
          //設定結束主鍵。
          PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
          endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MAX); //設定需要讀取的索引列最大值。
          endPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MAX); //設定需要讀取的索引列最大值。
          endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX); //設定資料表主鍵最大值。
          rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());
      
          rangeRowQueryCriteria.setMaxVersions(1);
      
          System.out.println("掃描索引表的結果為:");
          while (true) {
              GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
              for (Row row : getRangeResponse.getRows()) {
                  System.out.println(row);
              }
      
              //如果nextStartPrimaryKey不為null, 則繼續讀取。
              if (getRangeResponse.getNextStartPrimaryKey() != null) {
                  rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
              } else {
                  break;
              }
          }
      }
      當需要返回的屬性列不在索引表中時,請自行反查資料表擷取資料。
      private static void scanFromIndex(SyncClient client) {
          RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria(INDEX_NAME); //設定索引表名稱。
      
          //設定起始主鍵。
          PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
          startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MIN); //設定需要讀取的索引列最小值。
          startPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MIN); //設定需要讀取的索引列最小值。
          startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MIN); //設定資料表主鍵最小值。
          rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());
      
          //設定結束主鍵。
          PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
          endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MAX); //設定需要讀取的索引列最大值。
          endPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MAX); //設定需要讀取的索引列最大值。
          endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX); //設定資料表主鍵最大值。
          rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());
      
          rangeRowQueryCriteria.setMaxVersions(1);
      
          while (true) {
              GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
              for (Row row : getRangeResponse.getRows()) {
                  PrimaryKey curIndexPrimaryKey = row.getPrimaryKey();
                  PrimaryKeyColumn pk1 = curIndexPrimaryKey.getPrimaryKeyColumn(PRIMARY_KEY_NAME_1);
                  PrimaryKeyColumn pk2 = curIndexPrimaryKey.getPrimaryKeyColumn(PRIMARY_KEY_NAME_2);
                  PrimaryKeyBuilder mainTablePKBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
                  mainTablePKBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, pk1.getValue());
                  mainTablePKBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, pk2.getValue());
                  PrimaryKey mainTablePK = mainTablePKBuilder.build(); //根據索引表主鍵構造資料表主鍵。
      
                  //反查資料表。
                  SingleRowQueryCriteria criteria = new SingleRowQueryCriteria(TABLE_NAME, mainTablePK);
                  criteria.addColumnsToGet(DEFINED_COL_NAME3); // 讀取主表的DEFINED_COL_NAME3列
                  //設定讀取最新版本。
                  criteria.setMaxVersions(1);
                  GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
                  Row mainTableRow = getRowResponse.getRow();
                  System.out.println(row); 
              }
      
              //如果nextStartPrimaryKey不為null, 則繼續讀取。
              if (getRangeResponse.getNextStartPrimaryKey() != null) {
                  rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
              } else {
                  break;
              }
          }
      }

刪除索引表(DeleteIndex)

使用DeleteIndex介面刪除資料表上指定的索引表。

  • 參數
    參數說明
    mainTableName資料表名稱。
    indexName索引表名稱。
  • 樣本
    private static void deleteIndex(SyncClient client) {
        DeleteIndexRequest request = new DeleteIndexRequest(TABLE_NAME, INDEX_NAME); //設定資料表名稱和索引表名稱。
        client.deleteIndex(request); //刪除索引表。
    }