Результат:
Если вы работаете с набором данных, который является отказоустойчивым, или выполняющим одноразовый процесс, вы можете подтвердить, что может помочь изменение WriteAcknowledge to Unrevedledged.
Кроме того, массовые операции IsOrdered по умолчанию, которые я не знал. Установка этого параметра в False фактически делает операцию выполняемой массой, в противном случае она работает как один поток обновлений.
Драйвер MongoDB 3.0/WiredTiger/С#
У меня есть коллекция с 147 000 000 документов, из которых я выполняю обновления каждую секунду (надеюсь) около ок. 3000 документов.
Вот пример обновления:
"query" : {
"_id" : BinData(0,"UKnZwG54kOpT4q9CVWbf4zvdU223lrE5w/uIzXZcObQiAAAA")
},
"updateobj" : {
"$set" : {
"b" : BinData(0,"D8u1Sk/fDES4IkipZzme7j2qJ4oWjlT3hvLiAilcIhU="),
"s" : true
}
}
Это типичное обновление, в котором я должен вставлять мои требования со скоростью 3000 в секунду.
К сожалению, они занимают в два раза больше, например последнее обновление было для 1723 документов и заняло 1061 мс.
В коллекции только есть индекс на _id, нет других индексов, а средний размер документа для коллекции - 244 байта, не отображается.
Сервер имеет 64 ГБ памяти, 12 потоков. Вставка производительности превосходна с меньшими размерами коллекции, скажем, около 50 миллионов, но после того, как около 80 миллионов действительно начинают падать.
Может быть, потому, что весь набор не сидит в памяти? База данных поддерживается SSD RAID0, поэтому производительность IO не должна стать узким местом, и если бы это было, это должно было показать это в начале?
Понравилось бы некоторое руководство, поскольку я уверен, что MongoDB может выполнить мои довольно скудные требования по сравнению с некоторыми приложениями, в которых он используется. В базе данных нет существенной скорости чтения, поэтому Sharding не улучшит ситуацию, хотя, возможно, я ошибаюсь.
В любом случае текущая скорость вставки недостаточно хороша.
Обновление: вот объяснение() только запроса...
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "Collection",
"indexFilterSet" : false,
"parsedQuery" : {
"_id" : {
"$eq" : { "$binary" : "SxHHwTMEaOmSc9dD4ng/7ILty0Zu0qX38V81osVqWkAAAAAA", "$type" : "00" }
}
},
"winningPlan" : {
"stage" : "IDHACK"
},
"rejectedPlans" : []
},
"executionStats" : {
"executionSuccess" : true,
"nReturned" : 1,
"executionTimeMillis" : 1,
"totalKeysExamined" : 1,
"totalDocsExamined" : 1,
"executionStages" : {
"stage" : "IDHACK",
"nReturned" : 1,
"executionTimeMillisEstimate" : 0,
"works" : 2,
"advanced" : 1,
"needTime" : 0,
"needFetch" : 0,
"saveState" : 0,
"restoreState" : 0,
"isEOF" : 1,
"invalidates" : 0,
"keysExamined" : 1,
"docsExamined" : 1
},
"allPlansExecution" : []
},
Запрос сам по себе очень быстрый, и операция обновления занимает около 25 миллисекунд, их толкают в Mongo с помощью BulkWriter: await m_Collection.BulkWriteAsync(updates);