【问题标题】:Google Datastore Index Optimization谷歌数据存储索引优化
【发布时间】:2020-03-06 01:06:43
【问题描述】:

在设计仅键查询以过滤 Google 数据存储实体时,我生成了许多复合索引,它们是另一个索引的子集。是否可以对过滤已编入索引的属性子集的查询使用相同的复合索引?例如,如果我有以下仅键查询,是否有可能少于三个索引?

Query 1: Entities where a = 1, b = 1, c = 1;
Query 2: Entities where a = 1, b = 1;
Query 3: Entities where a = 1;

这是我正在使用的实际查询的示例:

Query<Key> query = Query.newKeyQueryBuilder()
              .setKind("track")
              .setFilter(CompositeFilter.and(PropertyFilter.eq("status", 1), PropertyFilter.eq("bpm", 138), PropertyFilter.eq("artist", "AVB"), PropertyFilter.eq("label", "Armada")))
              .setOrderBy(OrderBy.asc("date"))
              .build();

【问题讨论】:

  • 是的,我相信查询集可以使用三个内置索引和零个复合索引。查看cloud.google.com/datastore/docs/concepts/optimize-indexes
  • 当我尝试运行过滤属性子集的查询时,我收到“未找到匹配索引”异常。
  • 您是否在使用“>”之类的非等式过滤器?请注意,索引合并仅适用于“=”过滤器。你能发布一个代码 sn-p 显示你需要什么样的过滤器?
  • 我忘了提到查询也有一个 OrderBy 过滤器。我已更新问题以显示示例。其他查询与示例相同,只是它们从组合中逐一删除属性过滤器并过滤,直到“状态”属性上只有一个过滤器。
  • 顺便说一句,如果您对optimizing indexes 文档页面有任何反馈,我们将不胜感激。

标签: google-cloud-datastore


【解决方案1】:

Datastore 可以将较小的索引合并在一起以支持较大的相等查询,请参阅index merging。使用此功能,您的一组查询的最小索引集将类似于:

index.yaml

indexes:

- kind: Albums
  properties:
  - name: artist
  - name: date

- kind: Albums
  properties:
  - name: bpm
  - name: date

- kind: Albums
  properties:
  - name: label
  - name: date

- kind: Albums
  properties:
  - name: status
  - name: date

这支持对任意数量的这些属性进行相等查询,按日期排序。但是请注意,index merging has a performance trade-off in some cases.

【讨论】:

    猜你喜欢
    • 2018-01-18
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 2011-08-28
    • 2014-10-21
    相关资源
    最近更新 更多