чего то не возьму в толк. Есть у меня коллекция на 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
Офицальные гайды по оптимизации запросов молчат на эту тему.
Может кто сталкивался, подскажет куда копать. Или я может чего не так делаю?
А какой итоговый размер джсона, который вы получаете через 3-5 секунд?
5.5 мб на клиента улетает (25к записей)
Покажите пожалуйста 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: [] },
Если я не ошибаюсь то тут nReturned = totalDocsExamined должен быть. если не равно, то означает что индекс построин не правильно или же его вообще нету.
Все так, индекса не было, но как я говорил, не многое меняется, если его добавить
Вот теперь 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: [] },
Вы говорите что у вас коллекция на 500 тысяч документов, но в статистике планировщика: docsExamined: 75003
Обсуждают сегодня