沙发床N1QL中的复合索引(带有数组索引)与复合索引和单独的数组索引

时间:2019-03-22 13:00:26

标签: nosql couchbase n1ql

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

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

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

将在查询中使用索引的第一部分,但使用data(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

这个问题也是性能

1 个答案:

答案 0 :(得分:0)

您要检查数据数组的值为value5还是value6,或者必须同时显示两者。

如果要查找value5或value6,则应按以下方式使用。查询使用索引推送所有三个键。您可以使用EXPLAIN(检查跨度)进行验证

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

如果要同时查找value5和value6,则必须使用以下内容。查询使用索引推送所有三个键。但是这里有两种不同的索引扫描进行交叉(索引行一次只有一个值),您可以使用EXPLAIN进行验证(检查跨度)

任何v IN数据满足v = value5 END和任何v IN数据满足v = value6 END

如果您不想相交,可以执行以下操作。查询使用索引推送所有三个键和value6 IN数据过滤器在索引扫描后应用

任何v IN数据满足v = value5 END和value6 IN数据