【问题标题】:Differences between GSI and tableGSI 和表的区别
【发布时间】:2015-10-14 03:12:45
【问题描述】:

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

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

【问题讨论】:

标签: amazon-web-services amazon-dynamodb


【解决方案1】:

我会尝试一下。

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

假设您想要跟踪用户/组关系。这可能不是最好的例子,但我认为它会证明几点。

假设您的用例是您希望能够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. GSI GroupsToUsers 哈希+范围为groupId+userId

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

  1. 写信给UsersToGroups

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

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

有关详细信息,请参阅Guidelines for Global Secondary Indexes documentation

【讨论】:

    【解决方案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) 与全表扫描相比(在没有索引的情况下是不可避免的),它更快且成本更低。

    希望对你有帮助:)

    【讨论】:

      【解决方案3】:

      当在具有 GSI 的表上发生写入时,我必须同时写入表和索引。那么我的问题是为什么 GSI 不创建另一个表而不是全局二级索引?

      不,您不需要同时写入表和 GSI。 DynamoDB 会自动为您维护索引。 IE。当您写入表时,GSI 将自动更新。

      使用 GSI 有什么好处?

      您将能够通过 GSI 密钥“查询”数据。

      有很多例子的非常详细的解释就在那里http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多