如何在Google Datastore中创建复合索引实现实体多属性组合过滤
Google Datastore 多维度筛选复合索引最优方案
核心设计依据
Datastore复合索引有明确的规则约束:所有用于等值过滤的属性必须放在范围过滤属性的前面,本次场景中仅timestamp用于时间段范围查询,因此所有复合索引都需要把timestamp放在索引末尾。
可覆盖全场景的索引列表
根据你提到的3个非时间属性的任意组合筛选需求,创建以下索引即可覆盖所有查询场景:
- 双属性索引(单非时间属性+时间范围):
(attribute1, timestamp):支持仅筛选attribute1+指定时间段的查询(attribute2, timestamp):支持仅筛选attribute2+指定时间段的查询(attribute3, timestamp):支持仅筛选attribute3+指定时间段的查询
- 三属性索引(双非时间属性组合+时间范围):
(attribute1, attribute2, timestamp):支持同时筛选attribute1、attribute2+指定时间段的查询(attribute1, attribute3, timestamp):支持同时筛选attribute1、attribute3+指定时间段的查询(attribute2, attribute3, timestamp):支持同时筛选attribute2、attribute3+指定时间段的查询
- 四属性索引(三个非时间属性全选+时间范围):
(attribute1, attribute2, attribute3, timestamp):支持同时筛选三个非时间属性+指定时间段的查询
- 单属性索引:
(timestamp):支持无其他属性筛选、仅按时间段查询的场景
优化建议
- Datastore复合索引支持前缀匹配规则,比如已创建
(attribute1, attribute2, timestamp)索引的情况下,仅筛选attribute1+时间段的查询可以直接命中该索引的前缀,无需单独创建(attribute1, timestamp)索引,你可以根据实际业务的查询组合删减低频索引,降低索引存储成本和写入额外开销。 - 非时间属性的排序方向默认选择升序即可,
timestamp如果业务查询默认优先返回最新数据,可以设置为降序,注意查询时的排序方向要和索引定义的方向一致才能正常命中索引。 - 如果后续新增其他非时间筛选属性,只需在对应索引的等值过滤属性部分、
timestamp之前添加新增属性即可。
内容的提问来源于stack exchange,提问作者Sri Harsha
相关产品推荐
相关产品推荐

