优化看似简单的沙发基础查询“孩子满意的项目”

时间:2016-05-12 07:06:34

标签: query-optimization couchbase n1ql

我正在开发一个使用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。

1 个答案:

答案 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