如何在CouchDB中使用芒果查询减少查询执行时间?

时间:2018-07-03 13:44:26

标签: couchdb

我正在使用CouchDB中的芒果查询对15000条记录进行分页,但是随着我跳过更多数目的记录,执行时间会增加。

这是我的查询:

{
  "selector": {
    "name": {"$ne": "null"}
  },
  "fields": ["_id", "_rev", "name", "email" ],
  "sort": [{"name": "asc" }],
  "limit": 10,
  "skip": '.$skip.'
}

这里的跳过文档是动态的,取决于分页号,一旦跳过号增加,查询执行时间也会增加。

1 个答案:

答案 0 :(得分:1)

使用$ne(不相等)运算符的CouchDB“ Mango”查询由于索引的工作方式而容易遭受性能问题。一种解决方案是使用CouchDB的相对新的部分索引功能,创建*仅包含name不等于null的文档并建立索引。

部分索引允许在索引时间过滤数据库,因此内置索引仅包含通过您指定的过滤器测试的文档。然后可以在查询时间的查询中使用该索引,以进一步确定设置的数据。

通过调用/db/_index端点来创建索引:

POST /db/_index HTTP/1.1
Content-Type: application/json
Content-Length: 144
Host: localhost:5984

{
  "index": {
    "partial_filter_selector": {
      "name": {
        "$ne": "null"
      }
    },
    "fields": ["_id", "_rev", "name", "email"]
  },
  "ddoc": "mypartialindex",
  "type" : "json"
}

这将创建一个索引,其中仅包含name不为null的文档。然后,我们可以在查询时指定该索引:

{
  "selector": { 
    "name": {
      "$ne": "null"
    }
  },
  "use_index": "mypartialindex"
}

在上面的查询中,我的selector正在选择所有记录,但是它正在访问的索引已被过滤。您可以在此处向选择器添加其他子句,以在查询时进一步过滤数据。

CouchDB documentation herein this blog post中描述了部分索引。