我想知道是否可以设计 Google 数据存储区索引和查询,以减少我的项目所需的复合索引的数量。
我一直在尝试使用一个适用于我的两个查询的索引,例如发现的示例 here 。但是,我找不到一种方法让一个索引能够满足我的查询需求,我也不知道是否存在一个索引。 以下是我一直在使用的两个查询以及我收到的两个查询的数据存储区索引建议。我可以采取不同的措施来使这些查询使用单个索引吗?
查询1:
CompositeFilter.and(
CompositeFilter.and(PropertyFilter.gt("time", time1), PropertyFilter.lt("time", time2)),
PropertyFilter.eq("user", user1),
PropertyFilter.eq("color", color1),
PropertyFilter.eq("bpm", bpm1));
addOrderBy(OrderBy.asc("time"), OrderBy.asc("location"));
查询 1 索引建议:
- name: color
- name: bpm
- name: user
- name: time
- name: location
查询2:
CompositeFilter.and(
CompositeFilter.and(PropertyFilter.gt("time", time1), PropertyFilter.lt("time", time2)),
PropertyFilter.eq("user", user1));
addOrderBy(OrderBy.asc("time"), OrderBy.asc("color"), OrderBy.asc("bpm"), OrderBy.asc("location"));
查询2索引建议:
- name: user
- name: time
- name: color
- name: bpm
- name: location
最佳答案
我假设“创建”实际上是“时间”,因为您在过滤器中使用“时间”并在排序中使用“创建”。
请注意,任何数据存储查询都应该满足一个(或多个)索引的单次范围扫描。
在您的第一个查询中,您已固定了用户、颜色和 bpm,并且对于给定的时间范围,您希望按时间和位置进行排序。因此,您需要将用户、颜色和 bpm 作为前缀列,后跟时间和位置。
在第二个查询中,您只需固定用户,并且在给定的时间范围内您希望按时间、颜色、bpm 和位置进行排序。这意味着,用户是唯一的分区,然后必须立即在给定的时间范围内进行扫描。在这种情况下,颜色和 BPM 在时间之后出现,以支持排序顺序。
这就是为什么单一索引不可能逃脱惩罚的原因。但是,如果您查询的给定用户和时间范围的数据不多,您可以只对用户和时间建立索引,然后在获得结果后进行内存排序。如果您想使用投影查询,那么您将需要所有列和第二个索引以及内存中过滤(用于精确的 bpm 和颜色),并且需要排序。
关于java - 是否可以为这两个查询设计一个 Google Datastore 索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58469498/