复合索引(带有数组索引)和带有单独数组索引的复合索引的性能,磁盘使用率和速度是多少?
假设我有一个类似于此结构的文档
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
这个问题也是表现
您是否正在检查数据数组是否具有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数据