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