我無法理解全局二級索引和表格之間的區別。GSI和表格之間的差異
- 爲什麼我會使用全局二級索引,爲什麼不只是創建另一個表?
- 我必須指定兩者的讀寫吞吐量。當使用GSI寫表時發生寫操作時,我必須寫入表和索引。那麼我的問題是爲什麼GSI不創建另一個表而不是全局二級索引?
- 使用GSI會帶來什麼好處?
我無法理解全局二級索引和表格之間的區別。GSI和表格之間的差異
讓我們分解你的問題。
1.全局二級索引和表之間有什麼區別。
表:在dynamo中,db表只是數據的存儲工具,與rdbms不同,它不需要維護任何類型的約束以及與另一個表的關係。
GSI:它是由dynamo db提供的一個功能,它有助於以更快的方式從表中檢索數據。
2.爲什麼我會使用全局二級索引,爲什麼不只是創建另一個表。
由於dynamo db是一個NoSQL數據庫,我們無法像使用oracle這樣的傳統RDBMS來做查詢。爲了達到查詢的目的,我們需要在基於我們想查詢的表的那些屬性上具有索引。如果我們不把GSI或LSI的索引作爲索引,我們想要提取一些信息,我們將不得不掃描整個表格。
如果我們創建另一個表,那麼我們還需要在某個時間點查詢該表。
3.當用gsi寫一個表時,我必須同時寫入表和索引。
雖然我不確定,但我們可以放心地假定數據不會單獨寫入表格和原始格式的索引。他們必須在他們的數據庫中進行某種優化。所以與簡單的db寫入相比,所涉及的成本並不完全相似。
也我們,開發人員,不需要寫入GSI和表中寫入它是由dynamo數據庫本身管理,我們只需要在表中寫。
4.通過使用gsi可以獲得什麼好處?
a)與LSI不同,GSI保持索引鬆散耦合表。我們可以在需要時單獨創建/刪除它們。所以它比LSI更好
b)由於它提供了散列和範圍組合,因此查詢可以以更優化的方式完成。
c)與全表掃描(無索引情況下無法避免)相比,它的速度更快,成本更低。
希望它能幫助:)
當一個寫上了GSI我必須寫表和索引都表出現。那麼我的問題是爲什麼GSI不創建另一個表而不是全局二級索引?
不,您不需要同時寫入表格和GSI。 DynamoDB會自動爲您維護索引。即當您寫入表格時,GSI將自動更新。
通過使用GSI我可以獲得什麼好處?
您將能夠通過GSI密鑰「查詢」數據。
用大量的實例非常詳細的解釋是正確的有http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html
我會在這坐刺。
有一件事是你得到了一個最終一致的數據視圖,它也可以作爲一種「事務性」模型。
想象一下,您想要跟蹤用戶/組關係。這可能不是最好的例子,但我認爲它會證明幾點。
假設您的用例是您希望能夠爲所有用戶組的Query
所有用戶組和Query
組。在這個簡單的設置,你會覺得有2個表:
UsersToGroups
與哈希+範圍的userId
+ groupId
GroupsToUsers
與哈希+的groupId
+ userId
範圍。如果你需要做一個更新客戶端需要任何關係:
UsersToGroups
表(哈希:userId
,範圍:groupId
)GroupsToUsers
表( hash:groupId
,範圍:userId
)如果第二次寫入失敗會發生什麼?如果第二次寫入失敗,如何回滾第一次寫入?你怎麼知道你的第二次寫入失敗,說如果連接失敗發生?
這些問題並不好玩。
使用GSI,您可以擁有一張表,具體取決於您想如何管理它。如果不使用2個表格,假設我使用單個表格和單個GSI。
UsersToGroups
與散列+的userId
+`範圍GROUPIDGroupsToUsers
GSI與散列+的groupId
+ userId
範圍。如果您需要做任何關係的更新客戶端需要:
UsersToGroups
這就是它。 您只需提出1個請求。如果寫入成功,您可以保證您的索引將(最終)具有相同的數據。根據您查詢此索引的頻率或需要傳播多少數據,您可以相應地調整吞吐量。
這個簡單的例子假設userId
S和groupId
是獨一無二的,沒有衝突將會發生時,他們預計該指數,但我認爲這很好地解釋至少有一些用處
欲瞭解更多信息的一個很好的工作,請參閱Guidelines for Global Secondary Indexes documentation。