复合索引(带数组索引)vs复合索引和couchbase N1QL中的单独数组索引

问题描述 投票:0回答:1

复合索引(带有数组索引)和带有单独数组索引的复合索引的性能,磁盘使用率和速度是多少?

假设我有一个类似于此结构的文档

key1:value1,
key2:value2,
key3:value3,
key4:value4,
data:[
    value5,
    value6,
    value7,
},
key8:value8

根据我对Couchbase N1QL的理解,如果我创建索引和查询类似于:

CREATE INDEX indx_data ON document(key1,key4, ALL DISTINCT ARRAY v FOR v IN data END

SELECT * FROM document WHERE key1=value1 AND key4=value4 AND ANY v IN data SATISFIES v=value5 END AND ANY v IN data SATISFIES v=value6

索引的第一部分将用于查询,但是对于数据的第二个值(ANY v IN data SATISFIES v=value6),索引将不会被使用?那么为key1和key4设置一个索引然后为数组提供一个单独的索引来比较它会更好吗?或者有没有办法使用复合索引,包括数组?

刚出现的另一个问题是:

最好有一个文档来索引我刚刚提出或类似于:

key1:value1,
key2:value2,
key3:value3,
key4:value4,
data:{
    key5:value5,
    key6:value6,
    key7:value7,
},
key8:value8

这个问题也是表现

nosql couchbase n1ql
1个回答
0
投票

您是否正在检查数据数组是否具有value5或value6,或者必须同时存在两者。

如果您正在寻找value5或value6,您应该使用如下。查询使用索引推送所有三个键。您可以使用EXPLAIN验证(检查Spans)

任何v IN数据满足v IN [value5,value6] END

如果您要查找value5和value6必须出现,您必须使用如下。查询使用索引推送所有三个键。但是这里两个不同的索引扫描确实是交点(索引行一次只有一个值)你可以使用EXPLAIN验证(检查Spans)

任何v IN数据SATISFIES v = value5 END AND ANY v IN数据SATISFIES v = value6 END

如果你不想交叉,你可以做以下。查询使用索引推送所有三个键和value6 IN数据过滤器应用后索引扫描

任何v IN数据SATISFIES v = value5 END AND value6 IN数据

© www.soinside.com 2019 - 2024. All rights reserved.