【问题标题】:DynamoDB GSI with range key item count 0范围键项目计数为 0 的 DynamoDB GSI
【发布时间】:2016-05-21 04:06:50
【问题描述】:

我在 DynamoDB 中有一个如下所示的表:

我在表中添加了一个关于“类别”的全局二级索引,它运行良好,并在项目计数下给了我表中的项目数。

然后我意识到我实际上需要能够在特定的“类别”中搜索,但按“UserRating”排序

所以我删除了 GSI 并像这样新建了一个:

我认为这一切都很好,正确的类别(字符串)和 UserRating(数字)的名称是正确的。

但是在它完成创建 GSI 之后,我查看了控制台,它显示项目计数为 0,即使该测试表中应该有 13 个,如下图所示:

感谢您的帮助。

【问题讨论】:

    标签: amazon-web-services key amazon-dynamodb


    【解决方案1】:

    根据Amazon documentation,这大约每 6 小时更新一次。

    ItemCount - 全局二级索引中的项目数。 DynamoDB 大约每六个小时更新一次此值。最近的更改可能不会反映在此值中。

    在我的例子中,即使控制台仍然显示 ItemCount 零并且没有返回索引扫描/查询的结果,我还是能够从我的代码中成功查询它。

    【讨论】:

    • 即使 6 小时后计数仍为 0
    【解决方案2】:

    我认为当键模式类型和具体项目类型之间存在简单的类型不匹配时,这种情况更有可能发生。

    来自Managing Global Secondary Indexes -

    注意

    在某些情况下,由于索引键违规,DynamoDB 将无法将数据从表写入索引。如果属性值的数据类型与索引键模式数据类型的数据类型不匹配,或者如果属性的大小超过索引键属性的最大长度,则会发生这种情况。索引键违规不会干扰全局二级索引的创建;但是,当索引变为 ACTIVE 时,索引中不会出现违规键。

    DynamoDB 提供了用于查找和解决这些问题的独立工具。如需更多信息,请参阅Detecting and Correcting Index Key Violations

    举例

    项目看起来像:

        "Items": [
        {
            "Timestamp": {
                "N": "1542475507"
            },
            "DevID": {
                "S": "slfhioh1234oi23lk23kl4h235pjpo235lnsfvuwerfj2roin2l3rn9fj9f8hwen"
            },
            "UID": {
                "S": "1"
            }
        }
    ],
    

    索引看起来像:

      "GlobalSecondaryIndexes": [
            {
                "IndexName": "UID-Timestamp-index",
                "Projection": {
                    "ProjectionType": "KEYS_ONLY"
                },
                "ProvisionedThroughput": {
                    "WriteCapacityUnits": 1,
                    "ReadCapacityUnits": 1
                },
                "KeySchema": [
                    {
                        "KeyType": "HASH", 
                        "AttributeName": "UID"
                    },
                    {
                        "KeyType": "RANGE",
                        "AttributeName": "Timestamp"
                    }
                ], 
            }
        ]
    

    表格有属性定义:

    "AttributeDefinitions": [
            {
                "AttributeName": "Timestamp",
                "AttributeType": "S"
            },
            {
                "AttributeName": "UID",
                "AttributeType": "S"
            }
        ]
    

    该项目将不会出现在您的新索引中。

    类型不匹配(在本例中为 "S" != "N" )完全有可能在创建时没有被标记。这是有道理的。您可能想要故意做这种事情,但是当您不小心做时 - 它不是很好

    【讨论】:

    • 超级微妙且难以找到。感谢您指出!
    【解决方案3】:

    当索引名称包含破折号时,我也有奇怪的行为(没有结果),如 OP 的屏幕截图所示。用下划线替换破折号解决了我的问题。

    【讨论】:

      【解决方案4】:

      找到了答案。我在测试时将所有内容的读写容量设置为 1 个单位,只要我增加它就可以修复错误并且我可以看到这些项目。

      【讨论】:

      • 请解释一下。读写能力如何影响表中的项目?
      • DynamoDb 可能在 Nicholas 测试设置时更新了项目计数。汤米的回答是正确的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多