如何删除和组合appengine索引?

时间:2013-12-04 10:20:56

标签: python google-app-engine google-cloud-datastore

我有一种使用了很多我想优化的写操作。

SDK生成了以下索引:

    - kind: Prefix
      properties:
      - name: deleted_in
      - name: hostkey
      - name: list_name
      - name: added_in

    - kind: Prefix
      properties:
      - name: list_name
      - name: added_in

    - kind: Prefix
      properties:
      - name: list_name
      - name: deleted_in

似乎应该可以通过改变第一个索引的顺序来组合至少两个。但是,这样做会导致缺少索引的错误。

这让我感到惊讶,因为第一个索引不是查询过滤器的顺序或类型的顺序。我的查询在任何给定的顺序都可以正常工作。

query(
            Prefix.list_name == lst,
            Prefix.hostkey == hostkey,
            Prefix.deleted_in == None,
            Prefix.added_in > None,
        )

保存索引的另一种可能方法是关闭一些自动单属性索引。是否可以使复合索引中包含indexed=False的属性?

1 个答案:

答案 0 :(得分:1)

当您运行查询时,它可以由单个复合索引满足,也可以使用多个索引并使用zigzag merge join algorithm

您列出的第一个索引是回答查询的单个索引。首先,索引必须指定所有相等过滤器,然后必须指定不等式过滤器/顺序。正如您所提到的,相等过滤器的顺序无关紧要,它们只需要出现在不等式(或顺序)之前。为了使zigzag merge join工作,所有索引必须满足不等式过滤器/顺序。因此,为了对您的查询使用合并连接,您必须使用所有已将added_in作为最后一个属性的索引。以下是您可以使用的一组索引的示例:

- kind: Prefix
  properties:
  - name: list_name
  - name: added_in

- kind: Prefix
  properties:
  - name: hostkey
  - name: added_in

- kind: Prefix
  properties:
  - name: deleted_in
  - name: added_in

由于您已经有一个索引(list_name,added_in),您可以添加另一个索引:

- kind: Prefix
  properties:
  - name: hostkey
  - name: deleted_in
  - name: added_in

当它与您在(list_name,added_in)上的现有索引结合使用时,它可以回答您的查询。

但是,如您所见,您无法使用其他两个索引来回答您的查询。原因是您的索引(list_name,deleted_in)没有索引上的不等式属性。

Here is a good reference page.

回答第二个问题:不,在复合索引中仍然具有属性时,无法关闭单属性索引。有关它的讨论,请参阅this issue tracker