我正在处理一个项目,该项目要求我搜索CouchDB数据库以进行近似匹配,然后对结果进行排序。我决定使用Mango查询系统,因为我事先并不知道将使用哪种字段和排序组合。这个问题的近似匹配部分不是问题,我创建的索引表现非常好。但是,当我对结果进行排序时,整个事情都会变慢,即使从_explain我可以看到它正在使用我的索引。
我在这些查询中尽可能明确,因为我发现它可以帮助CouchDB自动找到正确的索引。
这是我做的一个简单查询的例子:
{
"selector": {
"$and": [
{
"arr_one.0": {
"$gte": "findOne"
}
},
{
"arr_one.0": {
"$lt": "findOne\ufff0"
}
},
{
"arr_one.1": {
"$gte": "findTwo"
}
},
{
"arr_one.1": {
"$lt": "findTwo\ufff0"
}
}
]
},
"fields": ["_id"],
"limit": 25
}
其中arr_one是我正在查看的数组,我试图找到第一个元素上以findOne开头的字符串和第二个元素上以findTwo开头的字符串。
我的索引的相关部分如下所示:
"fields": [
"arr_one.0",
"arr_one.0",
"arr_one.1",
"arr_one.1"
]
此查询也可以非常快速地运行并找到与上面相同的结果,但不会对结果进行正确排序:
{
"selector": {
"$and": [
{
"arr_one.0": {
"$gte": "findOne"
}
},
{
"arr_one.0": {
"$lt": "findOne\ufff0"
}
},
{
"arr_one.1": {
"$gte": "findOne"
}
},
{
"arr_one.1": {
"$lt": "findOne\ufff0"
}
},
{
"sort": {
"$gt": null
}
}
]
},
"sort": [
{
"arr_one.0": "asc"
},
{
"arr_one.1": "asc"
},
{
"sort": "asc"
}
],
"fields": ["_id"],
"limit": 25
}
使用索引:
"fields": [
"arr_one.0",
"arr_one.0",
"arr_one.1",
"arr_one.1"
"sort"
]
现在,这是问题查询和索引,它在搜索和排序中起作用,但需要很长时间才能完成:
{
"selector": {
"$and": [
{
"sort": {
"$gt": null
}
},
{
"arr_one.0": {
"$gte": "findOne"
}
},
{
"arr_one.0": {
"$lt": "findOne\ufff0"
}
},
{
"arr_one.1": {
"$gte": "findOne"
}
},
{
"arr_one.1": {
"$lt": "findOne\ufff0"
}
}
]
},
"sort": [
{
"sort": "asc"
},
{
"arr_one.0": "asc"
},
{
"arr_one.1": "asc"
}
],
"fields": ["_id"],
"limit": 25
}
使用索引:
"fields": [
"sort,
"arr_one.0",
"arr_one.0",
"arr_one.1",
"arr_one.1"
]
任何帮助试图找出如何优化这一点将不胜感激。我对任何建议持开放态度。
编辑:
我已经简化了问题,但仍然遇到了同样的问题。 我只使用单个值和单个范围来尝试,而不是使用数组。即使使用索引,仍然会得到相同的慢查询。
{
"selector": {
"$and": [
{
"sort": {
"$gt": null
}
},
{
"val": {
"$gte": "findOne"
}
},
{
"val": {
"$lt": "findOne\ufff0"
}
}
]
},
"sort": [
{
"sort": "asc"
},
{
"val": "asc"
}
],
"limit": 25
}
使用索引:
"fields": [
"sort",
"val",
"val"
]