Couchbase索引

时间:2017-10-19 09:46:04

标签: performance couchbase

我在couchbase中有这些类型的文档:

{
    delete: true,
    entity: {
        id: "1aec5ee9-bb4b-494d-9cfd-b7d890abad76",
        name: 'Bob'
    }
    _class: "com.company.package.A"
}

{
    delete: false,
    entity: {
        id: "5996c870-3b00-4c6a-a569-52b0c9e8adc9",
        city: 'London'
    }
    _class: "com.company.package.B"
}

哪些索引对这些查询更好:

select * from bucket where _class = "com.company.package.A" and delete=true and entity.name = "Bob"
select * from bucket where _class = "com.company.package.B" and delete=false and entity.city = "London"
  1. _class的GSI
  2. 已删除的GSI
  3. 实体名称的GSI,当_class =" com.company.package.A"
  4. 对于entity.city的GSI,当_class =" com.company.package.B"
  5. OR

    1. 字段组的GSI {entity.name,_class,deleted},当_class =" com.company.package.A"
    2. 字段组的GSI {entity.city,_class,deleted},当_class =" com.company.package.B"
    3. 不要为_class创建单独的GSI索引并在所有
    4. 中删除

1 个答案:

答案 0 :(得分:0)

覆盖全球二级索引将无需从数据服务中检索文档,从而提供最佳性能。

查询时使用显式字段名称。如果您使用select *,Couchbase仍然必须转到数据服务,以查看从索引中排除的其他字段。

在您的情况下,您需要两个索引:

CREATE INDEX covering_index1 ON default(`delete`, entity.id, entity.name) WHERE _class = "com.company.package.A";
CREATE INDEX covering_index2 ON default(`delete`, entity.id, entity.city) WHERE _class = "com.company.package.B"; 

如果您不需要entity.id,可以将其从已覆盖的字段中删除。

请注意delete必须在`中,因为它是保留字。