我有一种使用了很多我想优化的写操作。
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
的属性?
答案 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。