爆炸式索引和 Unix 时间戳

Kim*_*Kim 2 google-app-engine google-cloud-datastore google-cloud-platform

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

在每个实体中都有一个 unix 纪元时间戳和一个用户 ID。

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

SELECT * FROM <kind> WHERE time >= value AND time <= value and userId = value

问题是我必须创建一个复合索引,但我也阅读了有关爆炸索引和存储空间的内容,但我不太明白。

有人可以向我解释一下,如果创建这样的复合索引是“爆炸式索引”,以及查询是否良好。

Dan*_*scu 5

爆炸式索引问题(以及相关的存储使用量增长)仅适用于索引中包含多值(数组/重复)属性的情况。由于您的特定查询仅引用单值属性(timeuserId),因此相应的索引不会是爆炸式索引。

但是您可能有一个需要考虑的潜在问题:单调time属性可能会在高读/写率下引起麻烦。从索引

  • 不要用单调递增的值(例如 NOW() 时间戳)索引属性。维护此类索引可能会导致热点,从而影响具有高读取和写入速率的应用程序的 Cloud Datastore 延迟。有关处理单调属性的进一步指导,请参阅下面针对窄键范围的高读/写率

同样,如果您需要使用排序或过滤器查询单调递增(或递减)的属性,则可以改为对新属性进行索引,为此,您可以在单调值前面加上一个在整个数据集中具有高基数的值,但是对您要执行的查询范围内的所有实体都是通用的。例如,如果您想按时间戳查询条目,但一次只需要返回单个用户的结果,则可以在时间戳前加上用户 ID 并索引该新属性。这仍将允许对该用户进行查询和排序结果,但用户 ID 的存在将确保索引本身被很好地分片。