我正在尝试调整高容量网站的性能。我正在使用boto.dynamodb2库。如果给定它的主哈希键(没有范围),我如何只从记录中检索指定的属性?
作为次要问题,这是否会影响我们如何向亚马逊收费?亚马逊根据每个记录或每千字节读取的数据收费(以较大的单位为准)。如果对于给定的记录,我有3个属性,总共只有100个字节,而第4个属性总共为63KB,我只请求前3个(较小的)属性。我是否收取1个单位的费用,或者我仍被收取64个单位?
答案 0 :(得分:3)
从boto's documentation for get_item您可以传递attributes_to_get list:
attributes_to_get(list) - 属性名称列表。如果提供, 只返回指定的属性名称。否则,全部 属性将被返回。
遗憾的是,你不能通过跳过属性来“保存”读取。来自DynamoDB's documentation:
对于任何返回项目的操作,您可以请求其子集 要检索的属性;但是,这样做对项目没有影响 尺寸计算。
另请注意,项目大小限制为64KB(因此您不能拥有300KB的属性)
答案 1 :(得分:1)
您可以查看Local Secondary Index on DynamoDB。对于本地二级索引,您可以指定与主键相同的哈希键,以及要检索的特定属性列表,您只需为这些属性付费。索引的大小将计入DynamoDB存储分配,这不是那么昂贵,恕我直言。
选择要投影到本地辅助节点的属性时 index,您必须考虑预配置吞吐量之间的权衡 成本和存储成本:
如果您需要尽可能少地访问几个属性 延迟,考虑只将那些属性投射到本地 二级指数。指数越小,成本就越低 存储它,你的写入成本就越少。如果有 您偶尔需要获取的属性,成本 预定的吞吐量可能会超过长期成本 存储这些属性。
如果您的应用程序经常访问某些非关键属性, 您应该考虑将这些属性投射到本地辅助中 指数。本地二级索引的额外存储成本将是 抵消了频繁进行表扫描的成本。
如果您需要频繁访问大多数非关键属性 基础上,您可以投影这些属性 - 甚至是整个源 table-到本地二级索引。这会给你最大的 灵活性和最低配置吞吐量消耗,因为没有 提取将是必需的;但是,您的存储成本会增加, 如果要预测所有属性,甚至可以加倍。
如果您的应用程序需要不经常查询表,但必须 考虑,对表中的数据执行许多写入或更新 投影KEYS_ONLY。本地二级指数将是最小的 大小,但在查询活动需要时仍然可用。
来自An Introduction to boto’s DynamoDB v2 interface:
您还可以针对本地二级索引运行查询。只需提供索引名称(index ='FirstNameIndex')&根据其字段过滤参数:
# Users within the last hour.
>>> recent = users.query(
... account_type__eq='standard_user',
... date_joined__gte=time.time() - (60 * 60),
... index='DateJoinedIndex'
... )
>>> for user in recent:
... print user['first_name']
'Alice'
'Jane'