Datastore文档非常清楚,如果包含‘单调递增值’(如当前unix时间),则“热点”存在问题,但是没有提到一个很好的替代方案,也没有解决存储相同值(而不是增加值)是否会造成“热点”的问题:
“不要用单调增加的值来索引属性(例如,NOW()时间戳)。维护这样的索引可能会导致对读写速率较高的应用程序的Cloud延迟产生影响的热点。”https://cloud.google.com/datastore/docs/best-practices。
我想存储每个特定实体被插入到数据存储中的时间,如果这是不可能的,那么只存储日期也是可行的。
不过,这似乎更有可能导致“热点”,因为每一个24小时的新实体都会被添加到相同的索引中(这是我的理解)。
也许索引的工作方式还有更多的事情要做(我很难找到正确的解释),一次又一次地使用相同的值索引是可以的,但是增量值不是很好。
如果有人能回答这个问题,或者更好地记录数据存储索引是如何工作的,我将不胜感激。
发布于 2017-01-17 06:36:53
您的应用程序实际上是否计划查询日期?如果不是,请考虑简单地不对该属性进行索引。如果您只需要不频繁地读取该属性,请考虑编写mapreduce而不是索引。
这一建议是由于BigTable平板的工作方式而提出的,下面将对此进行描述:https://ikaisays.com/2011/01/25/app-engine-datastore-tip-monotonically-increasing-values-are-bad/
据我所知,更重要的是,一个实体的主键不是单调增长的数字。最好有一个字符串键,这样就可以以更好的分发方式存储实体。
但是,作为一个非专家,我无法想象,如果有合理的需要,对具有单调值的单个属性的索引也会有同样的问题。例如,我知道在Nomulus代码库中,我们有一个对索引的合理需求,因为我们希望删除比特定时间更早的提交日志。
我认为在这些单调索引中发生的一件很酷的事情是,当这些tablet拆分没有发生时,获取索引中最左边或最右边的元素实际上比在索引中间获取内容具有更好的延迟特性。例如,如果您执行的查询只是获取索引中的第一个结果,它实际上可以比键查找更快。
发布于 2017-01-17 14:45:07
在这一页中有一条引号是贾斯汀链接到的,它非常有用:
作为一个开发人员,你能做些什么来避免这种情况?降低您的写入率,或想出了如何更好地分配值。
只要实体具有较低的写入速率,就可以存储索引时间戳。
如果您有一个要存储索引时间戳的实体,并且该实体具有较高的写入率,则解决方案是将该实体拆分为两个实体。实体A将具有需要频繁更新的属性,实体B将具有时间戳和不经常更新的属性。
当我这样做,我有一个共同的ID为两个实体,使它真的很容易从一个到另一个。
发布于 2017-06-28 04:40:55
您可以尝试只存储日期,并将随机的小时、分钟和秒放入时间戳中,然后稍后丢弃这些额外的数据。(或者保留小时和分钟,并使用随机秒,例如)。我不是百分之百肯定这会起作用,但如果你需要索引的日期,这是值得一试。
https://stackoverflow.com/questions/41690158
复制相似问题