Проблема производительности с CouchDB Mango Index

Я работаю над проектом, который требует от меня поиска в базе данных 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 ответов

Другие вопросы по тегам