CouchDB芒果指数的绩效问题

时间:2018-04-17 19:29:42

标签: nosql couchdb couchdb-mango

我正在处理一个项目,该项目要求我搜索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"
]

0 个答案:

没有答案