如何使用数据存储区存储日期?

时间:2017-01-17 06:13:37

标签: google-app-engine google-cloud-datastore

数据存储文档非常清楚,"热点"存在问题。如果你包括单调增加价值' (就像当前的unix时间一样),但是没有提到一个好的替代方案,也没有解决是否存储完全相同(而不是增加值)会产生"热点":

"不要使用单调递增值(例如NOW()时间戳)来索引属性。维护这样的索引可能会导致热点影响具有高读写速率的应用程序的云数据存储延迟。" https://cloud.google.com/datastore/docs/best-practices

我想存储每个特定实体插入数据存储区的时间,如果这不可能,那么只存储日期也可以。

这似乎更有可能导致"热点"但是,因为24小时内的每个新实体都会被添加到相同的索引中(无论如何我都理解这一点)。

也许还有更多关于索引如何工作的事情(我很难找到关于它们如何工作的很好的解释)并且一遍又一遍地使用相同的价值指数是好的,但增值不是。

如果有人对此问题有答案,或者有关数据存储索引如何工作的更好文档,我将不胜感激。

3 个答案:

答案 0 :(得分:1)

您的应用程序是否真的计划查询日期?如果没有,请考虑简单地不索引该属性。如果您只需要不经常读取该属性,请考虑编写mapreduce而不是索引。

由于BigTable平板电脑的工作方式,我们给出了这样的建议,如下所述:https://ikaisays.com/2011/01/25/app-engine-datastore-tip-monotonically-increasing-values-are-bad/

据我所知,让实体的主键不是单调递增的数字更为重要。拥有一个字符串键会更好,这样可以更好地分发实体。

但是,作为一个非专家,我无法想象,如果合法需要,具有单调价值的单个属性的索引将是有问题的。我知道Nomulus代码库,例如,我们对时间索引有合法需求,因为我们想要删除超过特定时间的提交日志。

我认为这些单调索引的一个很酷的事情是,当这些平板电脑拆分没有发生时,获取索引中最左边或最右边的元素实际上具有比在索引中间获取东西更好的延迟属性。例如,如果您执行的查询只是获取索引中的第一个结果,那么它实际上可以比键查找更快。

答案 1 :(得分:0)

Justine链接的页面中有一个关键引用非常有帮助:

  

作为开发人员,您可以做些什么来避免这种情况? ...降低写入率,找出如何更好地分配值。

只要该实体的写入速率较低,就可以存储索引时间戳。

如果您有一个实体要存储索引时间戳并且实体具有高写入率,那么解决方案是将实体拆分为两个实体。实体A的属性需要经常更新,实体B的时间戳和属性不会经常更新。

当我这样做时,我有两个实体的共同ID,使其很容易从一个实体到另一个实体。

答案 2 :(得分:0)

您可以尝试仅存储日期并将随机小时,分钟和秒放入时间戳,然后稍后丢弃该额外数据。 (或者保持小时和分钟,并使用例如随机秒)。我不是百分之百确定这会有效,但如果你需要为日期编制索引值得尝试。