Доброго дня. Уже недельку ищу решение проблемы медленного курсора, и

чего то не возьму в толк. Есть у меня коллекция на 500к элементов, хочу из нее вытащить 25-40к записей, и отдать их на клиента.

Стенд - репликасет (1 master 2 replica) 4.4.2 в докере на одном хосте.

Запрос банален
testmodel.find({
"resourceType": "virtualMachine"
})
Пробовал монгусом, и стандартным mongodb в nodejs разница на уровне погрешности. Результат запроса удручающий, 3-5 секунд.
Понимаю, что все тупит, именно из за сетевых задержек, т.к разворачивая в docker-compose на локальной машине точно такой же конфиг время работы = 250ms стабильно.

Попробовал tcpdump пить трафик с хостов на себя и смотреть ответы, вижу что ответы летят пачками по 10-12 записей (движения курсора?)

Вопрос.
Разве это не нормально, хотеть вытащить из базы 25к элементов? Я много хочу? Монга так не работает?

У меня явное ощущение, что я чего то в розетку не включил, и оно просто не работает.

Пробовал строить индексы по этому полю, реиндексить, и тд. эффекта 0.
Пытался крутить batchSize до 100 в нативном клиенте эффекта не заметил (tcpdump показывает все те же 10-12 записей)
Крутил коннекшен пул, тоже без результата.

Документы мелкие, 5 полей, тестом рандомом наполнил, выглядят вот так.
{
"_id" : ObjectId("5fe256cff6accd21a13e9155"),
"team" : "7LWNfcrf",
"resourceName" : "mk5CU5BdmfHtuUA8KRU22CfrMzIkRSJ09yPl",
"resourceType" : "virtualMachine",
"storeSize" : 3599942,
"reportId" : "c510f214-79de-4e12-b725-2af120a50003",
"__v" : 0
}

Находил пару вопросов по перформансу cursor в интернете, но также без ответов и рекомендаций.

https://dba.stackexchange.com/questions/193708/aggregation-vs-cursor-for-reshaping-mongodb-documents

https://forums.meteor.com/t/iterating-over-mongo-cursor-too-slow-server-side/19531/10

https://stackoverflow.com/questions/31357025/mongodb-cursor-iteration-performance-issue


Офицальные гайды по оптимизации запросов молчат на эту тему.
Может кто сталкивался, подскажет куда копать. Или я может чего не так делаю?

8 ответов

23 просмотра

А какой итоговый размер джсона, который вы получаете через 3-5 секунд?

Vladimir-Lila Автор вопроса

Покажите пожалуйста explain({executionStats:1}) для вашего запроса

Vladimir-Lila Автор вопроса
yopp 💉💉
Покажите пожалуйста explain({executionStats:1}) дл...

Вот executionStats: { executionSuccess: true, nReturned: 25001, executionTimeMillis: 37, totalKeysExamined: 0, totalDocsExamined: 75003, executionStages: { stage: 'COLLSCAN', filter: [Object], nReturned: 25001, executionTimeMillisEstimate: 3, works: 75005, advanced: 25001, needTime: 50003, needYield: 0, saveState: 75, restoreState: 75, isEOF: 1, direction: 'forward', docsExamined: 75003 }, allPlansExecution: [] },

Vladimir Lila
Вот executionStats: { executionSuccess: true...

Если я не ошибаюсь то тут nReturned = totalDocsExamined должен быть. если не равно, то означает что индекс построин не правильно или же его вообще нету.

Vladimir-Lila Автор вопроса
Дара
Если я не ошибаюсь то тут nReturned = totalDocsExa...

Все так, индекса не было, но как я говорил, не многое меняется, если его добавить

Vladimir-Lila Автор вопроса
Дара
Если я не ошибаюсь то тут nReturned = totalDocsExa...

Вот теперь explain executionStats: { executionSuccess: true, nReturned: 25001, executionTimeMillis: 30, totalKeysExamined: 25001, totalDocsExamined: 25001, executionStages: { stage: 'FETCH', nReturned: 25001, executionTimeMillisEstimate: 5, works: 25002, advanced: 25001, needTime: 0, needYield: 0, saveState: 25, restoreState: 25, isEOF: 1, docsExamined: 25001, alreadyHasObj: 0, inputStage: [Object] }, allPlansExecution: [] },

Vladimir Lila
Вот executionStats: { executionSuccess: true...

Вы говорите что у вас коллекция на 500 тысяч документов, но в статистике планировщика: docsExamined: 75003

Похожие вопросы

Обсуждают сегодня

Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
сделал сайт, прикрутил в боте сайт, и виджет логина. как автоматически логинить пользователя в аккаунт(телеграм), при входе с бота?
Александра Чернивецкая
5
Объясните, пожалуйста, почему компилятор ругается на использование в условии неинициализированной переменной: int x; Task.Run(async () => { x = await somefunc(); }).Wait...
Александр
5
Ребят, подскажите, пожалуйста, почему в префиксе к ассетам, которые генерируются через фильтр | theme в шаблоне, стал вдруг появляться index.php? Вот так выглядит ссылка на а...
Виталий
1
Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
1. https://www.kaggle.com/code/ahmadrezagholami2001/housing-estimation-linear-regression 2. https://www.kaggle.com/code/ahmadrezagholami2001/uncovering-quality-in-wines-logis...
Ahmadreza
1
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
а плаксы из-под питона умеют только в комфортных условиях что-то выдавить из себя?)
Lencore
9
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
13
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Карта сайта