当前位置: 首页 > 知识库问答 >
问题:

DynamoDB中的全局与局部二级索引

阎弘
2023-03-14

我仍然对本地二级索引的使用感到困惑。当需要LSI与GSI时,请给我具体的用例。

例如,“GenreAlbumTitle”索引应该是GSI还是LSI?https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey

我似乎无法理解是否需要LSI,因为我需要的任何索引都将覆盖表的整行,而不仅仅是特定于一个分区。如果有人也能触及成本方面,因为我知道LSI更便宜(但为什么更便宜)?

谢谢大家!

共有2个答案

长孙翔
2023-03-14

对于使用LSI的成本有一些误解,所以让我在这里澄清一下。

使用LSI不是免费的。与GSI一样,dynamoDB需要创建和维护表的其他部分副本,以便快速获得结果。额外副本的维护将产生与GSI相同的额外读、写和存储成本。(额外费用将以粗体书写)。唯一的区别是,您没有分配单独的薪资计划,而是使用与主表相同的薪资计划。

在讨论额外成本之前,让我再次总结一下部分复制表中存储了什么样的信息。部分表副本(LSI)包含分区键(与原始表相同)、排序键(与原始表不同)和任何额外的投影属性。

原始表格

申屠弘图
2023-03-14

Dynamo中的每个项目都必须有一个唯一的主键。主键是基表索引。主键必须有一个分区键,并且可以选择有一个范围键(也称为排序键)。在分区中,项目按范围键排序。使用分区键访问项目速度很快。

辅助索引允许您使用替代键查询表。本地辅助索引(LSI)与主键(索引)具有相同的分区键,但范围键不同。考虑LSI的方法是它与主索引(键)相同的数据,只是按不同的属性排序。

全局二级索引(GSI)与主键具有不同的分区键,因此是不同的数据集。

LSI和GSI之间的一个重要区别是,LSI从基表中获取其吞吐量,在基表中,您可以单独购买GSI吞吐量。换句话说,LSI不需要任何成本,而GSI会在基表上产生额外成本。

让我们看看音乐表示例。假设基表有这个模式;

Artist: (Primary Key) Partition Key
SongTitle: (Primary Key) Range Key
AlbumTitle:
DateOfRelease:

此表是歌曲列表。我可以非常高效地访问艺术家的所有歌曲(即,使用分区键按艺术家查询)。当我进行此查询时,歌曲将按SongTitle排序。我还可以使用唯一的主键非常有效地访问艺术家和歌曲标题的歌曲。

现在假设我想获取艺术家的所有歌曲,但由DateOfRelise排序。在当前模式中,我需要获取所有歌曲,然后在我的应用程序中对它们进行排序。一个很好的替代方案是创建一个新索引,其中分区键为artist,范围键为DateOfReleas。这将是一个LSI,因为索引(artist)的分区键与主键的分区键相同。我不需要购买额外的吞吐量容量,因为此索引将从基表容量中自行提供。

现在让我们假设我想按专辑标题访问歌曲,按歌曲标题排序,即创建专辑列表。为了有效地做到这一点,我使用分区键AlbumTitle和范围键SongTitle创建了一个新索引。这是一个GSI,因为分区键与主键不同。此GSI必须单独提供给基表,因此需要额外的成本。

在回答您的问题时,GenreAlbumTitle是一个GSI,因为它对音乐有不同的分区键。

 类似资料:
  • 我正在DynamoDB中创建一个表和GSI,使用以下参数,如文档所示: 是表的主键,我使用作为GSI的主键。(为了简洁起见,我删除了一些不必要的配置参数) 我正在使用以下命令查询此表: 但我一直在犯错误: "一个或多个参数值无效:条件参数类型与模式类型不匹配" 在文档中,它指定主可以是或,并且您可以在字段中设置。我正在以的形式发送,不确定这里缺少了什么。 问题是在我创建表的方式上,还是在我查询表的

  • 我有以下带有三个全局二级索引(GSI)的DyamoDB表 Id(主键)、user_id(GSI)、event_type(GSI)、product_id(GSI)、rate、create_date 我有以下三种查询模式: null null

  • 我是AWS DynamoDB和nosql的新手,我对表创建有问题。 我试图创建一个名为的表,具有以下属性: 用户ID(HASH) OSType(范围) MSISDN IMSI 设备ID 我不仅需要通过查询表,还需要通过以下字段查询表: MSISDN 我的逻辑如下: 通过字段查询表 在阅读了有关LSI/GSI的手册后,我很难理解如何创建表和定义这些索引。 这是我尝试使用PHP AWS SDK创建表的

  • AWS CLI for Dynamodb创建表在创建全局二级索引时有点混乱。在CLI文档中,它表示全局二级索引可以用以下表达式(简写)表示: 我的解释是,我应该这样做 请注意,我在这里不包括KeySchema来推断复杂性。控制台显示以下错误: 因此AWS CLI无法识别ProvisionedThroughput的映射表达式。我尝试了几种表达方式,但都没能成功。我也没有在谷歌上找到任何描述如何做的网

  • 我在Dynamodb中有一个表,我试图通过命名全局二级索引来获取一个项目(使用),但我得到了错误: 我的问题是: 但后来我查看了get文档,它没有属性。所以我想也许我应该命名GSI而不是表名: 但后来我面对: 这意味着不被识别为全局表。所以我的问题是,拥有操作列表: 批量获取 批量写入 createSet 删除 得到 把 查询 扫描 更新 哪些支持GSI和LSI?此外,如果您想使用GSI检索一个特

  • 我有一个DynamoDB表,分区键为userID,没有排序键。该表在每个项目中还具有时间戳属性。我想检索在指定范围内具有时间戳的所有项目(无论用户ID如何,即跨所有分区)。在阅读文档并搜索堆栈溢出(此处)后,我发现需要为我的表创建一个GSI。因此,我使用以下键创建了一个GSI: 分区键: 排序键: 我正在使用Java SDK使用以下代码查询索引: 执行此代码时出现以下错误: 据我所知,我应该能够仅