全部產品
Search
文件中心

Tablestore:二級索引介紹

更新時間:Jun 30, 2024

當某些應用需要使用不同屬性作為查詢條件來執行資料查詢時,您可以通過將這些屬性作為二級索引的主鍵列實現按照屬性快速查詢資料的需求。Table Store提供了本地二級索引和全域二級索引來滿足您不同讀取一致性要求的查詢情境。本文介紹了二級索引的基本概念、索引類型、功能特性、注意事項等資訊。

背景資訊

Table Store的資料表是通過指定主鍵來實現表中資料的查詢。但是,通常情況下很多應用可能需要通過資料表主鍵以外的屬性對資料進行查詢。為瞭解決此問題,您可以為資料表建立一個或多個二級索引,然後使用索引表查詢資料。

二級索引相當於把資料表的主鍵查詢能力擴充到了不同的列,使用二級索引能加快資料查詢的效率。建立二級索引時,您需要將要查詢的多個屬性作為索引表的主鍵列,然後使用索引表的主鍵列快速查詢所需資料。具體範例情境說明請參見使用情境

基本概念

名詞

描述

索引表

對資料表中某些列資料的索引。

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

預定義列

在建立資料表時預先定義一些非主鍵列以及其類型,作為索引表的索引列或者屬性列。

說明

Table Store為Schema-free模型,原則上一行資料可以寫入任意屬性列,無需在SCHEMA中指定屬性列。

單列索引

只為某一列建立索引。

複合式索引

多個列組合成索引,複合式索引中包含複合式索引列1、列2。

索引表屬性列

被映射到索引表中的預定義列。

索引列補齊

系統自動將未出現在索引列中的資料表主鍵補齊到索引表主鍵中。

索引類型

Table Store提供了全域二級索引和本地二級索引兩種類型的索引。全域二級索引以非同步方式將資料表中被索引的列和主鍵列的資料自動同步到索引表中,正常情況下同步延遲達到毫秒層級。

為了滿足使用者的強一致性查詢等需求,Table Store推出了本地二級索引。本地二級索引以同步方式將資料表中被索引的列和主鍵列的資料自動同步到索引表中,當資料寫入資料表後,即可從索引表中查詢到資料。

全域二級索引和本地二級索引在同步方式、對第一列主鍵要求、同步延遲和讀取一致性方面的區別請參見下表說明。

維度

全域二級索引

本地二級索引

同步方式

非同步方式

同步方式

第一列主鍵要求

可選資料表中的任意主鍵列或者預定義列

必須和資料表的第一列主鍵相同

同步延遲

毫秒層級

即時

讀取一致性

最終一致性

強一致性

功能特性

二級索引的功能特性包括單列索引和複合式索引、索引同步、覆蓋索引(Covered Indexes)、存量索引和稀疏索引(Sparse Indexes)。具體介紹請參見下表說明。

功能特性

說明

單列索引和複合式索引

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

索引同步

全域二級索引和本地二級索引的資料同步方式不同。

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

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

覆蓋索引

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

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

存量索引

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

稀疏索引

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

例如資料表有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聯絡Table Store支援人員。

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

使用索引表時的注意事項

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

    • 寫入資料時,不能自訂資料的版本號碼。

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

  • 索引表只能用於查詢資料,不能直接寫入資料。

介面

使用二級索引的相關介面請參見下表。

介面

說明

CreateIndex

為已存在的資料表建立索引表。

說明
  • 目前使用CreateIndex單獨建立的索引表中可以選擇包含或者不包含在資料表執行CreateIndex前已存在的資料。

  • 您也可以使用CreateTable介面在建立資料表的同時建立一個或者多個索引表。

GetRow

單行讀取索引表中資料。

GetRange

範圍讀索引表中資料。

DropIndex

刪除資料表上指定的索引表。

重要

使用DeleteTable介面刪除資料表前,必須先刪除資料表下的索引,否則資料表將刪除失敗。

使用方式

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

計費說明

使用二級索引功能將產生額外的資料存放區量。當向資料表寫入資料時,在建立索引的過程中以及讀取資料時會消耗計算資源。更多資訊,請參見二級索引計量計費

相關文檔

如果需要更靈活豐富的資料加速查詢方式,例如多條件組合查詢、全文檢索索引、首碼查詢、模糊查詢等,您可以使用多元索引實現。更多資訊,請參見多元索引簡介

常見問題