爆炸索引和 unix 时间戳

2024-01-03

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

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

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

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

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

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


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

但你可能有一个需要考虑的潜在问题:单调time属性可能会在高读/写速率下引起问题。从Indexes https://cloud.google.com/datastore/docs/best-practices#indexes:

  • 不要为具有单调递增值的属性(例如 NOW() 时间戳)建立索引。维持这样的指数可能会导致 影响应用程序 Cloud Datastore 延迟的热点 高读写率。有关处理的进一步指导 单调性质,参见窄键的高读/写率 范围 https://cloud.google.com/datastore/docs/best-practices#high_readwrite_rates_to_a_narrow_key_range below.

And

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爆炸索引和 unix 时间戳 的相关文章

随机推荐