我的每个实体都包含许多单值属性和一个数组。
每个实体都有一个 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(使用前将#替换为@)