我正在开发一个使用couchbase存储翻译的系统。
我的存储桶中有大约15,000个条目,如下所示:
{
"classifications": [
{
"documentPath": "Test Vendor/Test Project/Ordered",
"position": 1
}
],
"id": "message-Test Vendor/Test Project:first",
"key": "first",
"projectId": "project-Test Vendor/Test Project",
"translations": {
"en-US": [
{
"default": {
"owner": "414d6352-c26b-493e-835e-3f0cf37f1f3c",
"text": "first"
}
}
]
},
"type": "message",
"vendorId": "vendor-Test Vendor"
},
作为一个例子,我希望找到所有使用“测试供应商/测试项目/订购”的“documentPath”分类的消息。
我使用此查询:
SELECT message.*
FROM couchlate message UNNEST message.classifications classification
WHERE classification.documentPath = "Test Vendor/Test Project/Ordered"
AND message.type="message"
ORDER BY classification.position
但我很惊讶查询需要2秒才能执行!
查看query execution plan,似乎couchbase循环遍历所有邮件,然后过滤“documentPath”。
我希望首先过滤“documentPath”(因为实际上只有2个与我的查询匹配的documentPath),然后找到这些消息。
我试图在“分类”上创建一个索引,但它没有改变任何东西。
我的索引设置有问题,还是应该以不同方式构建数据以获得快速结果?
如果重要的话,我正在使用couchbase 4.5 beta。
答案 0 :(得分:2)
您的查询过滤了documentPath字段,因此分类索引实际上并没有帮助。您需要使用Couchbase 4.5上的新数组索引语法在documentPath字段本身上创建数组索引:
CREATE INDEX ix_documentPath ON myBucket ( DISTINCT ARRAY c.documentPath FOR c IN classifications END ) ;
然后,您可以使用如下查询在documentPath上查询:
SELECT * FROM myBucket WHERE ANY c IN classifications SATISFIES c.documentPath = "your path here" END ;
将EXPLAIN添加到查询的开头,以查看执行计划并确认它确实使用索引ix_documentPath。
此处提供更多详细信息和示例:http://developer.couchbase.com/documentation/server/4.5-dp/indexing-arrays.html