2017-10-19 59 views
0

我有这些类型的文件在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. GSI为_class
  2. GSI已删除
  3. GSI for entity.name,_class =“com.company.package.A”
  4. GSI为entity.city,当_class = “com.company.package.B”

OR

  1. GSI为字段{entity.name,_class,删除}的基团,当_class =“com.company.package.A”
  2. 组字段{entity.city,_class,deleted}时的GSI,_class =“com.company.package.B”时的GSI
  3. 不要创建单独的GSI索引_class并全部删除

回答

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必须在`的s,因为它是一个保留字。