【发布时间】:2014-04-30 00:39:11
【问题描述】:
如果我选择我的哈希键和范围键,使得唯一哈希键的数量非常少(最大:1000),而唯一的范围键更多,这会不会有问题?
唯一哈希和范围键的数量之间的比率是否会影响信息检索的性能?
【问题讨论】:
标签: amazon-dynamodb
如果我选择我的哈希键和范围键,使得唯一哈希键的数量非常少(最大:1000),而唯一的范围键更多,这会不会有问题?
唯一哈希和范围键的数量之间的比率是否会影响信息检索的性能?
【问题讨论】:
标签: amazon-dynamodb
如果有几个哈希键和多个范围键,这应该不是问题:
根据AWS Developer Guidelines for Working with Tables:
预置吞吐量取决于主键选择,并且 单个项目的工作负载模式。存储数据时,DynamoDB 将表中的项目划分为多个分区,并分发 数据主要基于散列键元素。提供的 与表相关的吞吐量也平均分配在 分区,不共享预配置吞吐量 分区。
基本上,每个哈希键都驻留在单个节点(即服务器)上。实际上,它被冗余存储以防止数据丢失,但在此讨论中可以忽略。当您提供吞吐量时,您间接确定了散布散列键的节点数量。但是,无论您提供多少吞吐量,单个哈希键都受到单个节点可以处理的限制。
解释我的三个警告:
1.哈希键的数量不会太少
您提到最多 1000 个哈希键,但问题是最小值是多少。例如,如果只有 10 个哈希键,那么您将很快达到每个键的吞吐量限制,并且实际上不会实现预配置的吞吐量。
2.您的访问权限随机分布在哈希键中
如果有少量“热”键,则拥有多少散列键并不重要。也就是说,如果您经常只读取或写入散列键的一小部分子集,那么您将达到存储这些键的节点的吞吐量限制。
3.您无需扩展到极端水平
即使假设您有 1000 个不同的哈希键并且您的访问权限是随机分布在它们之间的,如果您需要扩展到极端级别,您最终将达到每个哈希键位于单独节点上的点。也就是说,如果您提供足够的吞吐量以将每个哈希键分配给一个单独的节点(即您有 1000 多个节点),那么超出该级别的任何吞吐量都将不会实现,因为您将达到每个节点的每个键的限制.
范围键与哈希键的比率对获取、扫描和查询性能应该几乎没有影响。
据我了解,每个哈希键的范围键都有效地存储在某种可以很好扩展的索引中。但是,请记住,给定哈希键的所有行都一起存储在同一个节点上,因此您可能会遇到给定哈希键的数据过多的情况。 AWS Limits in DynamoDB 声明:
对于有本地二级索引的表,item 有限制 集合大小:对于每个不同的哈希键值,总大小 所有表和索引项的大小不能超过 10 GB。取决于你的 项目大小,这可能会限制每个散列的范围键的数量 价值。
【讨论】:
据我所知,这无关紧要。负载分布取决于访问的“频率”而不是“可能的组合”。如果您的访问权限均匀分布在您正在使用的 1000 个密钥中,那么就可以了 - 这意味着通过 key1 获取的概率应该类似于获取 key10 或 key100 的概率。在内部,我猜他们会将您的 1000 个密钥分成 3 个组,每个组“可能”由 3 台机器提供服务。您需要确保您的访问几乎是统一的,以便所有 3 台机器获得统一的负载分担。
【讨论】: