Проблема производительности с 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"
]