Google app engine 分解索引和unix时间戳

Google app engine 分解索引和unix时间戳,google-app-engine,google-cloud-platform,google-cloud-datastore,Google App Engine,Google Cloud Platform,Google Cloud Datastore,我的每个实体都由许多单值属性和一个数组组成 在每个实体中都有一个unix历元时间戳和一个用户id 我的问题是我希望能够进行这种查询 选择*FROM WHERE time>=value AND time爆炸性索引问题和相关的存储使用量增长仅在索引中包含多值数组/重复属性时适用。由于您的特定查询只引用单值属性time和userId,因此相应的索引不会是爆炸式的 但是您可能有一个需要考虑的潜在问题:单调时间属性在高读/写速率下可能会导致问题。发件人: 不要使用单调递增的值(如NOW时间戳)索引属性。维

我的每个实体都由许多单值属性和一个数组组成

在每个实体中都有一个unix历元时间戳和一个用户id

我的问题是我希望能够进行这种查询


选择*FROM WHERE time>=value AND time爆炸性索引问题和相关的存储使用量增长仅在索引中包含多值数组/重复属性时适用。由于您的特定查询只引用单值属性time和userId,因此相应的索引不会是爆炸式的

但是您可能有一个需要考虑的潜在问题:单调时间属性在高读/写速率下可能会导致问题。发件人:

不要使用单调递增的值(如NOW时间戳)索引属性。维持这样一个指数可能会导致 影响具有以下特性的应用程序的云数据存储延迟的热点 高读写速率。获取有关处理以下问题的进一步指导: 单调属性,见下文。 及

同样,如果需要查询单调递增或 使用排序或筛选器减少属性,可以改为索引 在新属性上,为其在单调值前面加上 值,该值在整个数据集中具有较高的基数,但对于 要执行的查询范围中的所有实体。对于 例如,如果您想按时间戳查询条目,但只需要 要一次返回单个用户的结果,可以在 使用用户id标记时间戳,并改为索引该新属性。这 仍然允许该用户查询和排序结果,但 用户id的存在将确保索引本身被很好地切分


指数爆炸不仅仅是一个综合指数问题。创建复合索引时,您只是为一组属性创建了另一个索引,而不是一个。通常,除非实体中的一个或多个属性是重复/嵌套字段,否则只能存储数据的一个副本。是指您错误地为实体的每个属性编制索引以查找傻笑,并且没有意识到如果您有重复或嵌套的字段,则会多次为其编制索引

示例:如果使用3个字符串属性保存此实体类型:

姓名、爱好和喜爱的颜色。即使为每个属性编制索引,也最多只能存储按每个属性排序的3个表,这没什么大不了的


但是,如果嗜好和喜爱的颜色存储为重复或嵌套字段,现在您有6个嗜好和7种颜色。。。现在每行存储6*7=42次!这就是你需要避免的。如果不需要对嵌套字段进行查询和排序,请不要对其编制索引。

谢谢您的答复,我还有几个后续问题。1.每个条目都有一个包含多个不同电话号码的数组,正如您所说,只有当数组是复合索引的一部分时,复合索引才会爆炸。数组本身是否有两个常规索引爆炸?2.电话号码的数量不同,从1到100,阵列是否会因为它们是号码而导致相同的速度减慢?3.关于单调值。所以我只是像这个userIdString\u时间戳一样预先设置时间戳。这应该可以解决瓶颈,并且仍然允许更少/更大/相等的运算符?我认为我不理解1,请澄清。对于2来说,是可能的值的数量使索引可能爆炸,而不是值是数字这一事实——例如,如果它们是字符串,也会发生同样的情况。此外,爆炸性索引不会导致读/写决战,它们只会导致更长的最终一致性持续时间和存储增加。是的,时间戳解决方案应该解决这些问题。如果我的问题不清楚,我很抱歉。大约1,每个条目都有一个属性,该属性是一个包含电话号码的数组,它从1到100不等。如果此属性不在复合索引中,而只是它自己的普通索引,则此数组是否会导致索引爆炸?另一个问题:由于数组包含字符串或数字类型的电话号码,该数组是否可能导致高读/写热点?对于1-否,数组属性的简单索引不会是爆炸性索引。从理论上讲,这些电话号码可能会引发热点问题,但事实上,在现实生活中发生这种情况的可能性有多大?可能是在测试期间,当您在批处理模式下用一堆条目预填充数据存储时。我不会太担心的。如果您这样做,您可以始终应用与时间戳相同的技术。