通過本文您可以瞭解二級索引的區別、基本概念、注意事項、功能等。

背景

通過建立一張或多張索引表,使用索引表的主鍵列查詢,二級索引相當於把資料表的主鍵查詢能力擴充到了不同的列。使用二級索引能加快資料查詢的效率。

為了滿足使用者的強一致性查詢等需求,Tablestore在支援全域二級索引的同時,推出了本地二級索引。

二級索引區別

二級索引包括全域二級索引和本地二級索引,請根據實際需要選擇合適的二級索引。

名稱區別
全域二級索引
  • 以非同步方式將資料表中被索引的列和主鍵列的資料自動同步到索引表中,正常情況下同步延遲達到毫秒層級。
  • 索引表的第一列主鍵可根據需要選擇任意主鍵列或者預定義列。
本地二級索引
  • 以同步方式將資料表中被索引的列和主鍵列的資料自動同步到索引表中,當資料寫入資料表後,即可從索引表中查詢到資料。
  • 索引表的第一列主鍵必須和資料表的第一列主鍵相同。

基本概念

名詞描述
索引表對資料表中某些列資料的索引。

索引表只能用於讀取資料,不能寫入資料。

預定義列在建立資料表時預先定義一些非主鍵列以及其類型,作為索引表屬性列。
说明 Tablestore為Schema-free模型,原則上一行資料可以寫入任意屬性列,無需在SCHEMA中指定屬性列。
單列索引只為某一列建立索引。
複合式索引多個列組合成索引,複合式索引中包含複合式索引列1、列2。
索引表屬性列被映射到索引表中的預定義列。
索引列補齊系統自動將未出現在索引列中的資料表主鍵補齊到索引表主鍵中。

功能

  • 單列索引和複合式索引

    支援為資料表中的某一列或者多個列建立索引。

  • 索引同步
    全域二級索引和本地二級索引的資料同步方式不同。
    • 使用全域二級索引時,Tablestore以非同步方式將資料表中被索引的列和主鍵列的資料自動同步到索引表中,正常情況下同步延遲達到毫秒層級。
    • 使用本地二級索引時,Tablestore以同步方式將資料表中被索引的列和主鍵列的資料自動同步到索引表中,當資料寫入資料表後,即可從索引表中查詢到資料。
  • 覆蓋索引(Covered Indexes)

    支援索引表中帶有屬性列。在建立資料表時預先定義一些列(稱為預定義列)後,可以對任意預定義列和資料表主鍵列進行索引,指定資料表的若干個預定義列作為索引表屬性列。索引表中也可以不包含任何屬性列。

    當指定資料表的若干個預定義列作為索引表屬性列時,讀取索引表可以直接得到資料表中對應預定義列的值,無需反查資料表。

  • 存量索引

    支援建立的索引表中包含資料表中的存量資料。

  • 稀疏索引(Sparse Indexes)

    如果資料表的某個預定義列作為索引表的屬性列,當資料表某行中不存在該預定義列時,只要索引列全部存在,仍會為此行建立索引。但是如果部分索引列缺失,則不會為此行建立索引。

    例如資料表有PK0、PK1、PK2三列主鍵,Defined0、Defined1、Defined2三列預定義列,設定索引表主鍵為PK0、Defined0、Defined1,索引表屬性列為Defined2。
    • 當資料表某行的屬性列中,只包含Defined0、Defined1兩列,不包含Defined2列時,會為此行建立索引。
    • 當資料表某行的屬性列中,只包含Defined0、Defined2兩列,不包含Defined1列時,不會為此行建立索引。

使用限制

更多資訊,請參見二級索引限制

注意事項

索引表的索引列和屬性列設定注意事項

  • 系統會自動對索引表進行索引列補齊。在對索引表進行掃描時,請注意填充對應主鍵列的範圍(一般為負無窮到正無窮)。

    在建立索引表時,只需要指定索引列,其它列會由系統自動添加。例如資料表有PK0和PK1兩列主鍵,Defined0作為預定義列。

    使用全域二級索引時,根據實際需要建立索引。
    • 如果在Defined0上建立索引,則產生的索引表主鍵會是Defined0、PK0、PK1三列。
    • 如果在Defined0和PK1上建立索引,則產生的索引表主鍵會是Defined0、PK1、PK0三列。
    • 如果在PK1上建立索引,則產生的索引表主鍵會是PK1、PK0兩列。
    使用本地二級索引時,索引表的第一個主鍵列必須與資料表的第一個主鍵列相同。
    • 如果在PK0和Defined0上建立索引,則產生的索引表主鍵會是PK0、Defined0、PK1三列。
    • 如果在PK0、PK1和Defined0上建立索引,則產生的索引表主鍵會是PK0、PK1、Defined0三列。
    • 如果在PK0和PK1上建立索引,則產生的索引表主鍵會是PK0、PK1兩列。
  • 根據查詢模式和成本的考慮選擇合適的資料表預定義列作為索引表屬性列。

    將資料表的一個預定義列作為索引表的屬性列後,查詢資料時無需反查資料表即可得到該列的值,但是同時增加了相應的儲存成本。反之則需要根據索引表反查資料表。

  • 使用全域二級索引時,請選擇合適的列作為索引表的第一個主鍵列。
    • 由於可能導致索引表更新速度變慢,不建議把時間相關列作為索引表主鍵的第一列。

      建議將時間列進行雜湊,然後在雜湊後的列上建立索引,如果有需求請使用DingTalk聯絡Tablestore支援人員。

    • 由於會導致索引表水平擴充能力受限,影響索引表寫入效能,不建議將取值範圍非常小,甚至可枚舉的列作為索引表主鍵的第一列,例如性別。

使用索引表時的注意事項

在帶有索引表的資料表中寫入資料時需遵循如下規則,否則在資料表中寫入資料會失敗。

  • 寫入資料時,不能自訂資料的版本號碼。
  • 批量寫入資料時,一個批量寫請求中,同一行資料(即主鍵相同)不能重複存在。

使用方式

您可以通過控制台、命令列工具或者SDK使用二級索引。

計費

更多資訊,請參見二級索引計量計費