Приветствую.
Есть относительно небольшая база в 2.5млн документов. Структура документов не сильно важна, тем более она "динамическая". Но есть запрос, который выполняется регулярно и довольно часто - выборка "самого-самого" и по условию отсутствия вложенного поля:
db.getCollection('special').find({
'checker.updated': { '$exists': false }
}).sort({'postedNum':-1}).limit(1)
Так вот дело в том, что этот запрос на базе выполняется около 40сек... Тогда как такой:
db.getCollection('special').find({
'checker.updated': { '$exists': false }
}).sort({'postedNum':1}).limit(1)
выплевывает результат менее чем за одну.
Пробовал индексами химичить:
- раздельно на поля postedNum:-1 и checker.updated:1
- делал сдвоенные postedNum:-1 + checker.updated:1
- пробовал использовать индекс на весь checker
Результата ноль. Если сортировать по возрастанию - моментально, как только реверс на убывание - "куримбамбук". Даже появились мысли, не свалить ли на что-то реляционное скульное, но там останавливает скорость активной работы с таблицами размером более 20-25млн записей...
Update 1. Попробовал заменить фильтр с вложенного поля на простое (создал копию из 'checker.updated' => 'checkerUpdated') - тоже все стало "летать" и с прямой и с обратной сортировкой. Ничего не понимаю... Как вариант решения, конечно, отказаться полностью от "вложенной структуры", но блин, это перелопатить половину кода и накостылять кучу блоков, которые должны будут "сворачивать/разворачивать" рабочие структуры в одноуровневые списки полей
Update 2. А теперь вообще ничего не понимаю. Повырубал все процессы/ноды, которые выполняли в параллели один и тот же запрос с вот этой "обратной сортировкой" (условия оставил, сортировку убрал - что не есть хорошо, но как временный вариант подойдет), и тут же ушли дикие задержки на выполнение этого же самого запроса с 40с+ до 2с... Получается, что такие дикие задержки дает множество параллельных обращений к базе с одним и тем же запросом, но именно в сочетании "сортировка + фильтр по вложенному полю"... Что за фигня???