GSI 与表的区别

use*_*127 4 amazon-web-services amazon-dynamodb

我无法理解全局二级索引和表之间的区别。

  • 为什么我要使用全局二级索引,为什么不创建另一个表?
  • 我必须为两者指定读取和写入吞吐量。当对带有 GSI 的表进行写入时,我必须同时写入表和索引。我的问题是为什么 GSI 不创建另一个表而不是全局二级索引?
  • 使用 GSI 有什么好处?

mko*_*bit 5

我会尝试一下。

一件事是您可以获得最终一致的数据视图,它也可以充当一种“事务”模型。

想象一下,您要跟踪用户/组关系。这可能不是最好的例子,但我认为它可以说明几点。

假设您的用例是您希望能够将Query所有组分配给一个用户,并将Query所有用户分配给一个组。在这个简单的设置中,您会想到有 2 个表:

  1. UsersToGroups哈希+范围为userId+groupId
  2. GroupsToUsers哈希+范围为groupId+ userId

如果您需要更新客户需要的任何关系:

  1. 写入UsersToGroups表(哈希:userId,范围:groupId
  2. 写入GroupsToUsers表(哈希:groupId,范围:userId

如果您的第二次写入失败会怎样?如果第二次失败,你如何回滚第一次写入?你怎么知道你的第二次写入失败了,比如连接失败?

这些问题处理起来并不有趣。

使用 GSI,您可以拥有一个表,具体取决于您希望如何管理它。如果不是使用 2 个表,假设我使用一个表和一个 GSI。

  1. UsersToGroups具有userId+`groupId哈希值+范围的表
  2. GroupsToUsers散列+范围为groupId+ 的GSI userId

如果您需要更新客户需要的任何关系:

  1. 写信给 UsersToGroups

这就对了。您只需提出 1 个请求。如果写入成功,您可以保证您的索引(最终)具有相同的数据。根据您查询此索引的频率或需要传播的数据量,您可以相应地调整吞吐量。

这个简单的例子假设userIds 和groupId是唯一的,并且当它们被投影到索引时不会发生冲突,但我认为它至少可以很好地解释一些有用性

有关更多信息,请参阅全球二级索引指南文档


Sub*_*thi 2

让我们把你的问题分成几部分。

1.全局二级索引和表有什么区别。

表:在 dynamo db 中,表只是数据的存储设施,与 RDBMS 不同,它不必维护任何类型的约束以及与其他表的关系。

GSI:它是 dynamo db 提供的一项功能,有助于以更快的方式从表中检索数据。

2. 为什么我要使用全局二级索引,为什么不直接创建另一个表。

由于 dynamo db 是一个 NoSql db,我们无法像使用 Oracle 等传统 RDBMS 那样进行查询。为了达到查询的目的,我们需要对要查询的表的那些属性建立索引。如果我们不创建 GSI 或 LSI 索引,并且想要提取一些信息,则必须扫描整个表。

如果我们创建另一个表,那么我们也需要在某个时间点查询该表。

3. 当使用 gsi 对表进行写入时,我必须同时写入表和索引。

虽然我不确定,但我们可以放心地假设数据不会以原始格式单独写入表和索引。他们一定在数据库内做了某种优化。因此,与普通数据库写入相比,所涉及的成本并不完全相同。

另外,我们开发人员不需要同时写入 GSI 和表,它由 dynamo db 本身管理,我们只需要写入表即可。

4. 使用 gsi 有什么好处?

a) 与 LSI 不同,GSI 使索引与表保持松散耦合。我们可以在需要时单独创建/删除它们。所以它比LSI更好

b) 由于它提供了哈希和范围组合,因此可以以更优化的方式完成查询。

c) 与表的完整扫描(在没有索引的情况下不可避免)相比,它更快且成本更低。

希望能帮助到你 :)