2016-03-05 3 views
1

Любое обновление документа на mongodb 3.2 (wiredtiger) всегда переписывает полный документ на диск или может выполнять частичное обновление.

Например, операция $ inc действительно изменяет структуру документа BSON. Если поле уже существует, то 4 байта для целого числа остаются в одной и той же позиции, и мы могли бы просто обновить 4 байта.

, на каком правиле можно изменить обновление с помощью wiredtiger на месте?

Благодаря

ответ

1

Примечание Следующая упрощен ради краткости и простоты понимания.

У WiredTiger есть парадигма для копирования на запись. С другой стороны, документы никогда не фрагментируются. Поэтому, если вы измените его, он будет скопирован.

НО: Документы синхронизируются на диске настолько часто, чтобы создать моментальный снимок. Каждые 60 секунд по умолчанию, в течение которого долговечность обеспечивается журналом записи вперед. WiredTiger очень эффективен при синхронизации дисков.

Таким образом, между двумя моментальными снимками операции $inc записываются в журнал и применяются к представлению вашего документа в памяти. Только когда создается новый снимок, документ фактически копируется.

Так что в основном каждый редактирование документа на месте, и только во время создания моментального снимка выполняется тяжелая работа.

+0

Я подтверждаю, что писал Маркус выше. Тем не менее, MongoDB пишет в журнал почти мгновенно (я считаю, что это 100 мс), но сериализация из журнала в фактическую коллекцию может произойти гораздо позже. – Saleem

+0

У вас есть статья, связанная с атомной операцией типа $ inc, которая подробно описывает hozw snapshot, журнал работает? Действительно ли wiredTiger сравнивается с mmapv1 быстрее для выполнения $ inc? –

+0

@ SébastienRichez Вы должны начать с документов https://docs.mongodb.org/manual/storage/ –

Смежные вопросы