我的每个实体都包含许多单值属性和一个数组。
在每个实体中都有一个unix纪元时间戳和一个用户ID。
我的问题是我希望能够做这种查询
SELECT * FROM <kind> WHERE time >= value AND time <= value and userId = value
问题是我必须创建一个复合索引,但我也读过有关爆炸索引和存储空间但我无法理解它。
有人可以向我解释一下,如果创建这样的复合索引,它是一个“爆炸索引”,如果查询是好还是没有。
答案 0 :(得分:4)
爆炸索引问题(以及相关的存储使用增长)仅适用于索引中包含多值(数组/重复)属性的情况。由于您的特定查询仅引用单值属性(time
和userId
),因此相应的索引不会是爆炸性的。
但是您可能需要考虑一个潜在问题:单调time
属性可能会导致高读/写速率的问题。来自Indexes:
- 不要使用单调递增值(例如NOW()时间戳)来索引属性。保持这样的指数可能会导致 影响应用程序的云数据存储延迟的热点 高读写速率。有关处理的进一步指导 单调属性,请参阅下面的High read/write rates for a narrow key range。
和
同样,如果你需要查询单调增加(或 使用排序或过滤器减少属性,您可以改为索引 在一个新属性上,为其单调值前缀为a 在整个数据集中具有高基数的值,但是很常见 要执行的查询范围内的所有实体。对于 例如,如果要按时间戳查询条目,但只需要 要一次返回单个用户的结果,您可以添加前缀 用户标识的时间戳和新属性的索引。这个 仍然允许该用户的查询和订购结果,但是 存在用户ID将确保索引本身得到很好的分片。
答案 1 :(得分:1)
爆炸索引不仅仅是一个复合索引问题。创建复合索引时,您只为一组属性创建另一个索引,而不是仅创建一个。通常,您只存储数据的一个副本,除非实体中的一个或多个属性是重复/嵌套字段。 Exploding index是指您错误地将实体的每个属性编入索引并且没有意识到如果您有一个REPEATED或NESTED字段,那么您将多次索引它。
示例:如果使用3个字符串属性保存此实体类型:
姓名&amp;兴趣爱好最喜欢的颜色。即使您索引每个属性,您最多也会存储按每个属性排序的3个表,没什么大不了的。
然而,如果爱好和喜欢的颜色存储为重复或嵌套的字段,现在你有6个爱好和7种颜色......现在每行存储6 * 7 = 42次!这就是你需要避免的。如果不需要查询和排序嵌套字段,请不要将其编入索引。