【问题标题】:Optional secondary indexes in DynamoDBDynamoDB 中的可选二级索引
【发布时间】:2013-09-10 09:17:22
【问题描述】:

我正在将我的持久层从 Riak 迁移到 DynamoDB。我的数据模型包含一个可选的业务标识符字段,希望能够作为键的替代项进行查询。

似乎 DynamoDB 二级索引不能是 null 并且需要范围键,因此尽管名称与 Riak 的二级索引相似,但让它看起来完全不同。

有没有一种优雅的方法可以有效地查询我的可选字段,而不是将数据放入外部搜索索引中?

【问题讨论】:

  • 从我过去的经验来看,一个查询除了查询二级索引外,还需要查询主索引。要点是您将无法仅通过二级索引进行查询。这可能在此期间发生了变化,但我对此表示怀疑。您可以轻松地运行查询来检查这一点。
  • 谢谢安德烈;这就是我得出的结论。我最终查询了我的 Elasticsearch 索引以按业务标识符检索数据。这有点滥用搜索索引,但必须这样做。

标签: amazon-web-services amazon-dynamodb secondary-indexes


【解决方案1】:

当您问这个问题时,DynamoDB 没有全局二级索引:http://aws.amazon.com/about-aws/whats-new/2013/12/12/announcing-amazon-dynamodb-global-secondary-indexes/

现在可以了。

本地二级索引最好被认为是二级范围键,并且作为二级范围键。 @andreimarinescu 是对的:您仍然必须按项目的哈希键查询,只有使用二级索引,您才能在该范围键上使用 DynamoDB 查询的比较运算符的有限子集(例如大于、等于、小于等)因此,您仍然需要知道您在哪个“哈希桶”内执行比较。

全局二级索引有点不同。它们更像是您的表的辅助版本(亚马逊在预置吞吐量方面向您收取类似的费用)。您可以将表的非主键属性用作全局二级索引中索引的主键属性,并相应地查询它们。

例如,如果您的表格如下所示:

|**Hash key**: Item ID | **Range Key**: Serial No | **Attribute**: Business ID |
--------------------------------------------------------------------------------
|           1          |        12345             |             1A             |
--------------------------------------------------------------------------------    
|           2          |        45678             |             2B             |
-------------------------------------------------------------------------------- 
|           3          |        34567             |            (empty)         |
--------------------------------------------------------------------------------
|           3          |        12345             |             2B             |
--------------------------------------------------------------------------------

然后,使用Business ID 上的本地二级索引,您可以执行诸如“查找哈希键为3 且业务ID 等于2B 的所有项目”之类的查询,但您无法执行“查找所有业务 ID 等于 2B" 的项目,因为二级索引需要哈希键。

如果您要使用业务 ID 添加全局二级索引,则可以执行此类查询。您实质上将为表提供备用主键。您可以执行类似“查找所有业务 ID 等于 2B 的项目并获取项目 2-45678 和 3-12345 作为响应。

稀疏索引在 DynamoDB 中运行良好;完全允许并非所有项目都有业务 ID,并且可以允许您将索引上的预置吞吐量保持低于表的吞吐量,具体取决于您预计有多少项目具有业务 ID。

【讨论】:

  • 所以 globa 二级索引就像使用不同的哈希键制作表的副本。这意味着您的存储使用量将增加。例如,如果我的表是 100mb 大,使用二级索引将使其使用 200mb。是真的吗?
  • @batmaci 之类的。我的意思是,您必须为全局二级索引表上的额外预置吞吐量付费。请注意,您不必将表的预置吞吐量加倍 - 您可以相互独立地设置主吞吐量容量和索引吞吐量容量。我不认为它实际上需要将数据的实际存储大小增加一倍,但这是 Amazon 处理的实施细节,您不必担心。
【解决方案2】:

使用 LSI 也可以做到这一点。 只要确保您没有向该属性写入任何数据即可。

在我的场景中,对于 LSI,我正在编写空字符串 (""),这是不允许的。我跳过了排序键的初始化,它工作正常。

基本上 DynamoDB 甚至不会为该行创建该属性。

行为的详细说明如下

How can I make a sparse index if the key is always required?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多