2015-10-14 118 views
1

我無法理解全局二級索引和表格之間的區別。GSI和表格之間的差異

  • 爲什麼我會使用全局二級索引,爲什麼不只是創建另一個表?
  • 我必須指定兩者的讀寫吞吐量。當使用GSI寫表時發生寫操作時,我必須寫入表和索引。那麼我的問題是爲什麼GSI不創建另一個表而不是全局二級索引?
  • 使用GSI會帶來什麼好處?

回答

0

讓我們分解你的問題。

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)與全表掃描(無索引情況下無法避免)相比,它的速度更快,成本更低。

希望它能幫助:)

0

當一個寫上了GSI我必須寫表和索引都表出現。那麼我的問題是爲什麼GSI不創建另一個表而不是全局二級索引?

不,您不需要同時寫入表格和GSI。 DynamoDB會自動爲您維護索引。即當您寫入表格時,GSI將自動更新。

通過使用GSI我可以獲得什麼好處?

您將能夠通過GSI密鑰「查詢」數據。

用大量的實例非常詳細的解釋是正確的有http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html

1

我會在這坐刺。

有一件事是你得到了一個最終一致的數據視圖,它也可以作爲一種「事務性」模型。

想象一下,您想要跟蹤用戶/組關係。這可能不是最好的例子,但我認爲它會證明幾點。

假設您的用例是您希望能夠爲所有用戶組的Query所有用戶組和Query組。在這個簡單的設置,你會覺得有2個表:

  1. UsersToGroups與哈希+範圍的userId + groupId
  2. GroupsToUsers與哈希+的groupId + userId範圍。

如果你需要做一個更新客戶端需要任何關係:

  1. 刻錄到UsersToGroups表(哈希:userId,範圍:groupId
  2. 刻錄到GroupsToUsers表( hash:groupId,範圍:userId

如果第二次寫入失敗會發生什麼?如果第二次寫入失敗,如何回滾第一次寫入?你怎麼知道你的第二次寫入失敗,說如果連接失敗發生?

這些問題並不好玩。

使用GSI,您可以擁有一張表,具體取決於您想如何管理它。如果不使用2個表格,假設我使用單個表格和單個GSI。

  1. UsersToGroups與散列+的userId +`範圍GROUPID
  2. GroupsToUsers GSI與散列+的groupId + userId範圍。

如果您需要做任何關係的更新客戶端需要:

  1. 刻錄到UsersToGroups

這就是它。 您只需提出1個請求。如果寫入成功,您可以保證您的索引將(最終)具有相同的數據。根據您查詢此索引的頻率或需要傳播多少數據,您可以相應地調整吞吐量。

這個簡單的例子假設userId S和groupId是獨一無二的,沒有衝突將會發生時,他們預計該指數,但我認爲這很好地解釋至少有一些用處

欲瞭解更多信息的一個很好的工作,請參閱Guidelines for Global Secondary Indexes documentation