我正在使用CouchDB中的芒果查询对15000条记录进行分页,但是随着我跳过更多数目的记录,执行时间会增加。
这是我的查询:
{
"selector": {
"name": {"$ne": "null"}
},
"fields": ["_id", "_rev", "name", "email" ],
"sort": [{"name": "asc" }],
"limit": 10,
"skip": '.$skip.'
}
这里的跳过文档是动态的,取决于分页号,一旦跳过号增加,查询执行时间也会增加。
答案 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 here和in this blog post中描述了部分索引。