二級索引
當某些應用需要使用不同屬性作為查詢條件來執行數據查詢時,您可以通過將這些屬性作為二級索引的主鍵列實現按照屬性快速查詢數據的需求。表格存儲提供了本地二級索引和全局二級索引來滿足您不同讀取一致性要求的查詢場景。本文介紹了二級索引的基本概念、索引類型、功能特性、注意事項等信息。
背景信息
表格存儲的數據表是通過指定主鍵來實現表中數據的查詢。但是,通常情況下很多應用可能需要通過數據表主鍵以外的屬性對數據進行查詢。為了解決此問題,您可以為數據表創建一個或多個二級索引,然后使用索引表查詢數據。
二級索引相當于把數據表的主鍵查詢能力擴展到了不同的列,使用二級索引能加快數據查詢的效率。創建二級索引時,您需要將要查詢的多個屬性作為索引表的主鍵列,然后使用索引表的主鍵列快速查詢所需數據。具體樣例場景說明請參見使用場景。
基本概念
名詞 | 描述 |
索引表 | 對數據表中某些列數據的索引。 索引表只能用于讀取數據,不能寫入數據。 |
預定義列 | 在創建數據表時預先定義一些非主鍵列以及其類型,作為索引表的索引列或者屬性列。 說明 表格存儲為Schema-free模型,原則上一行數據可以寫入任意屬性列,無需在SCHEMA中指定屬性列。 |
單列索引 | 只為某一列建立索引。 |
組合索引 | 多個列組合成索引,組合索引中包含組合索引列1、列2。 |
索引表屬性列 | 被映射到索引表中的預定義列。 |
索引列補齊 | 系統自動將未出現在索引列中的數據表主鍵補齊到索引表主鍵中。 |
索引類型
表格存儲提供了全局二級索引和本地二級索引兩種類型的索引。全局二級索引以異步方式將數據表中被索引的列和主鍵列的數據自動同步到索引表中,正常情況下同步延遲達到毫秒級別。
為了滿足用戶的強一致性查詢等需求,表格存儲推出了本地二級索引。本地二級索引以同步方式將數據表中被索引的列和主鍵列的數據自動同步到索引表中,當數據寫入數據表后,即可從索引表中查詢到數據。
全局二級索引和本地二級索引在同步方式、對第一列主鍵要求、同步延遲和讀取一致性方面的區別請參見下表說明。
維度 | 全局二級索引 | 本地二級索引 |
同步方式 | 異步方式 | 同步方式 |
第一列主鍵要求 | 可選數據表中的任意主鍵列或者預定義列 | 必須和數據表的第一列主鍵相同 |
同步延遲 | 毫秒級別 | 實時 |
讀取一致性 | 最終一致性 | 強一致性 |
功能特性
二級索引的功能特性包括單列索引和組合索引、索引同步、覆蓋索引(Covered Indexes)、存量索引和稀疏索引(Sparse Indexes)。具體介紹請參見下表說明。
功能特性 | 說明 |
單列索引和組合索引 | 支持為數據表中的某一列或者多個列建立索引。 |
索引同步 | 全局二級索引和本地二級索引的數據同步方式不同。
|
覆蓋索引 | 支持索引表中帶有屬性列。在創建數據表時預先定義一些列(稱為預定義列)后,您可以對任意預定義列和數據表主鍵列進行索引,指定數據表的若干個預定義列作為索引表屬性列。索引表中也可以不包含任何屬性列。 當指定數據表的若干個預定義列作為索引表屬性列時,讀取索引表可以直接得到數據表中對應預定義列的值,無需反查數據表。 |
存量索引 | 支持新建的索引表中包含數據表中的存量數據。 |
稀疏索引 | 如果數據表的某個預定義列作為索引表的屬性列,當數據表某行中不存在該預定義列時,只要索引列全部存在,仍會為此行建立索引。但是如果部分索引列缺失,則不會為此行建立索引。 例如數據表有PK0、PK1、PK2三列主鍵,Defined0、Defined1、Defined2三列預定義列,設置索引表主鍵為PK0、Defined0、Defined1,索引表屬性列為Defined2。
|
使用限制
更多信息,請參見二級索引限制。
注意事項
創建索引表時的注意事項
系統會自動對索引表進行索引列補齊。在對索引表進行掃描時,請注意填充對應主鍵列的范圍(一般為負無窮到正無窮)。
在創建索引表時,只需要指定索引列,其他列會由系統自動添加。例如數據表有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兩列。
根據查詢模式和成本的考慮選擇合適的數據表預定義列作為索引表屬性列。
將數據表的一個預定義列作為索引表的屬性列后,查詢數據時無需反查數據表即可得到該列的值,但是同時增加了相應的存儲成本。反之則需要根據索引表反查數據表。
使用全局二級索引時,請選擇合適的列作為索引表的第一個主鍵列。
由于可能導致索引表更新速度變慢,不建議把時間相關列作為索引表主鍵的第一列。
建議將時間列進行哈希,然后在哈希后的列上創建索引,如果有需求請使用釘釘聯系表格存儲技術支持。
由于會導致索引表水平擴展能力受限,影響索引表寫入性能,不建議將取值范圍非常小,甚至可枚舉的列作為索引表主鍵的第一列,例如性別。
使用索引表時的注意事項
在帶有索引表的數據表中寫入數據時需遵循如下規則,否則在數據表中寫入數據會失敗。
寫入數據時,不能自定義數據的版本號。
批量寫入數據時,一個批量寫請求中,同一行數據(即主鍵相同)不能重復存在。
索引表只能用于查詢數據,不能直接寫入數據。
接口
使用二級索引的相關接口請參見下表。
接口 | 說明 |
為已存在的數據表創建索引表。 說明
| |
單行讀取索引表中數據。 | |
范圍讀索引表中數據。 | |
刪除數據表上指定的索引表。 重要 使用DeleteTable接口刪除數據表前,必須先刪除數據表下的索引,否則數據表將刪除失敗。 |
使用方式
您可以通過控制臺、命令行工具或者SDK使用二級索引。
計費說明
使用二級索引功能將產生額外的數據存儲量。當向數據表寫入數據時,在建立索引的過程中以及讀取數據時會消耗計算資源。
表格存儲包括VCU模式(原預留模式)和CU模式(原按量模式)兩種計費模式。使用不同的計費模式時,計費方式不同。
計費模式 | 計費說明 |
VCU模式(原預留模式)以包年包月方式預先購買計算能力,計算能力中涵蓋二級索引操作、讀寫數據的計算消耗。 索引的數據存儲量與數據表無區別,按照不同存儲類型收費。更多信息,請參見數據存儲量。 | |
更多信息,請參見二級索引計量計費。 CU模式(原按量模式)是根據實際計算消耗折算成CU進行計費。同時根據實例規格不同,計費時需要區分按量讀寫CU以及預留讀寫CU。 索引表數據存儲量與數據表無區別,數據存儲類型與實例規格綁定。更多信息,請參見數據存儲量。 |
相關文檔
如果需要更靈活豐富的數據加速查詢方式,例如多條件組合查詢、全文檢索、前綴查詢、模糊查詢等,您可以使用多元索引實現。更多信息,請參見多元索引簡介。