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