google-app-engine - 如何使用数据存储存储日期?

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

数据存储文档非常清楚,如果您包含“单调递增的值”(如当前的 unix 时间),“热点”就会出现问题,但是没有提到一个好的替代方案,也没有解决是否存储完全相同(而不是增加值)会产生“热点”:

“不要为具有单调递增值(例如 NOW() 时间戳)的属性编制索引。维护这样的索引可能会导致热点,从而影响具有高读写速率的应用程序的 Cloud Datastore 延迟。” https://cloud.google.com/datastore/docs/best-practices

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

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

也许索引的工作方式还有更多问题(我很难找到关于它们究竟如何工作的很好的解释)并且一遍又一遍地使用相同的值索引很好,但增加值就不行了。

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

最佳答案

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

该建议是根据 BigTable 平板电脑的工作方式给出的,此处对其进行了描述:https://ikaisays.com/2011/01/25/app-engine-datastore-tip-monotonically-increasing-values-are-bad/

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

但是作为一个非专家来说,我无法想象具有单调值的单个属性的索引会产生同样的问题,如果它是合法需要的话。例如,我知道对于 Nomulus 代码库,我们有对时间索引的合法需求,因为我们想删除早于特定时间的提交日志。

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

关于google-app-engine - 如何使用数据存储存储日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41690158/

相关文章:

google-app-engine - 在 Java 中的 App Engine 数据存储中按键过滤

java - 在 App Engine 中查询数据存储的最有效方式

java - 第一个排序属性必须与应用不等式过滤器的属性相同

java - 使用谷歌应用程序引擎按数据存储中的时间列排序

google-app-engine - 尝试将 Utf-8 数据存储在数据存储中,获取 UnicodeEncodeError

PYTHON-数据存储中 TextProperty 的属性 "{field_name}"的值超过 1048487 个字节

java - 在一个请求中上传 JSON 和二进制文件

java - GAE 服务器和 Android 客户端上的数据类型

python - 是否可以有一个没有属性的实体类型?

google-app-engine - GSUtil 无权访问应用引擎中创建的对象