全部產品
Search
文件中心

Tablestore:建立二級索引

更新時間:Jun 30, 2024

二級索引相當於把資料表的主鍵查詢能力擴充到了不同的列,當需要使用屬性查詢資料時,您可以通過建立二級索引加快資料查詢的效率。設定預定義列後,在建立二級索引時將預定義列作為索引表的索引列或者屬性列。

說明
  • 二級索引包括全域二級索引和本地二級索引。關於二級索引的更多資訊,請參見二級索引

  • 您也可以使用CreateTable介面在建立資料表的同時建立一個或者多個索引表。具體操作,請參見建立資料表

前提條件

  • 已初始化Client。具體操作,請參見初始化OTSClient

  • 已建立資料表,且資料表的最大版本數(MaxVersions)必須為1,資料生命週期(TimeToLive)必須滿足如下條件中的任意一個。

    • 資料表的資料生命週期為-1(資料永不到期)。

    • 資料表的資料生命週期不為-1時,資料表為禁止更新狀態。

  • 資料表已設定預定義列。

注意事項

  • 索引表名稱不能與已存在的時序表名稱和資料表名稱相同。

  • 建立二級索引時,系統會自動將未出現在索引列中的資料表主鍵補齊到索引表主鍵中。

  • 建立本地二級索引時,索引表的第一列主鍵必須與資料表的第一列主鍵相同。

參數

參數

說明

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以同步方式將資料表中被索引的列和主鍵列的資料自動同步到索引表中,當資料寫入資料表後,即可從索引表中查詢到資料。

IncludeBaseData

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

當設定IncludeBaseData為true時,表示包含存量資料;設定IncludeBaseData為false時,表示不包含存量資料。

樣本

建立全域二級索引

以下樣本用於在主鍵為pk1、pk2的資料表上建立主鍵列為definedcol1,屬性列為definedcol2的索引表。該索引為全域二級索引且包括存量資料。該索引表的完整主鍵為definedcol1、pk1、pk2,屬性列為definedcol2。

func CreateGlobalIndexSample(client *tablestore.TableStoreClient, tableName string) {
    //建立索引表Meta。
    indexMeta := new(tablestore.IndexMeta) 
    //設定資料表的definedcol1列作為索引表的主鍵。
    indexMeta.AddPrimaryKeyColumn("definedcol1") 
    //設定資料表的definedcol2列作為索引表的屬性列。
    indexMeta.AddDefinedColumn("definedcol2") 
    //設定索引表名稱。
    indexMeta.IndexName = "<INDEX_NAME>"
    indexReq := &tablestore.CreateIndexRequest{
        //添加索引表到資料表。
        MainTableName:tableName, 
        IndexMeta: indexMeta,
        /**
          通過將IncludeBaseData參數設定為true,建立索引表後會開啟資料表中存量資料的同步,然後可以通過索引表查詢全部資料,
          同步時間跟資料量的大小有一定的關係。
        */ 
        IncludeBaseData: true, 
    }
     
    resp, err := client.CreateIndex(indexReq)
    if err != nil {
        fmt.Println("Failed to create table with error:", err)
    } else {
        fmt.Println("Create index finished", resp)
    }
}

建立本地二級索引

以下樣本用於在主鍵為pk1、pk2的資料表上建立主鍵列為pk1、definedcol1,屬性列為definedcol2的索引表。該索引為本地二級索引且包括存量資料。該索引表的完整主鍵為pk1、definedcol1、pk2,屬性列為definedcol2。

func CreateGLocalIndexSample(client *tablestore.TableStoreClient, tableName string) {
    //建立索引表Meta。
    indexMeta := new(tablestore.IndexMeta) 
    //索引表的第一列主鍵必須與資料表的第一列主鍵相同。
    indexMeta.AddPrimaryKeyColumn("pk1") 
    //設定資料表的definedcol1列作為索引表的主鍵。
    indexMeta.AddPrimaryKeyColumn("definedcol1") 
    //設定資料表的definedcol2列作為索引表的屬性列。
    indexMeta.AddDefinedColumn("definedcol2") 
    //設定索引類型為本地二級索引(IT_LOCAL_INDEX)。
    indexMeta.IndexType = tablestore.IT_LOCAL_INDEX 
    //設定索引表名稱。
    indexMeta.IndexName = "<INDEX_NAME>"
    indexReq := &tablestore.CreateIndexRequest{
        //添加索引表到資料表。
        MainTableName:tableName, 
        IndexMeta: indexMeta,
        /**
          通過將IncludeBaseData參數設定為true,建立索引表後會開啟資料表中存量資料的同步,然後可以通過索引表查詢全部資料,
          同步時間跟資料量的大小有一定的關係。
        */
        IncludeBaseData: true, 
    }
      
    resp, err := client.CreateIndex(indexReq)
    if err != nil {
        fmt.Println("Failed to create table with error:", err)
    } else {
        fmt.Println("Create index finished", resp)
    }
}

相關文檔

  • 建立二級索引後,您可以單行讀取或者範圍讀取資料。具體操作,請參見使用二級索引讀取資料

  • 如果不再需要使用二級索引,您可以刪除二級索引。具體操作,請參見刪除二級索引