2017-10-19 61 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,因爲它是一個保留字。