2012-05-10 2 views
2

Как установка флага WriteConcern в SAFE в java-драйвере влияет на производительность MongoDB?Производительность MongoDB в режиме SAFE

+0

Это может быть глупый вопрос, который я задаю, но: вы можете себе представить себя легко, думая *, что производительность снижается. На сколько? Измерить его с помощью * вашей * системы и * ваших * данных. –

+0

Это неподдельный вопрос, поскольку Монго по-умолчанию забывает и забывает. Очевидно, что он будет замедляться, но я искал ответ, основанный на том, как другие люди имели дело с этим – Rand

ответ

4

Замедляет его значительно (как и следовало ожидать).

Без флага «SAFE» водители MongoDB работают в режиме «Огонь Забудьте». Поэтому команда update отправляется на сервер, а затем драйвер продолжает работу. Если есть ошибка с записью или сервер умирает до того, как произойдет изменение, клиент ничего не знает об этом.

С флагом SAFE драйверы выполняют команду update и команду getLastError(). Эта вторая команда не будет завершена до тех пор, пока обновление фактически не произойдет в БД. По крайней мере, вы отправляете две команды вместо одной (, так что она на 50% медленнее).

По моему опыту это на самом деле на 5x20x медленнее. Конечно, это имеет смысл, потому что на самом деле запись данных является медленной частью всей этой части.

Обратите внимание, что без флага SAFE некоторые исключения никогда не произойдут. Например, вы никогда не получите дублирующее ключевое исключение.

Если вы планируете использовать MongoDB в качестве типичной базы данных (аналогично MySQL), вам необходимо использовать как минимум Режим «SAFE» и набор реплик. В противном случае вам нужен режим «ЖУРНАЛ» с одним ящиком. Я использую режим JOURNAL, вы заметите, что производительность начинает выглядеть как обычный SQL.

+2

. Ваш ответ не на 100% правильный. «Конечно, это имеет смысл, потому что на самом деле запись данных - это медленная часть всей этой части». Это не обязательно так, поскольку «безопасный» режим означает только то, что вставка/обновление применяется в * памяти *. Для обеспечения того, чтобы все было на диске, вам понадобится «fsync». – Derick

+0

@Derick: есть две проблемы с вашим ответом. # 1: вы также можете обеспечить, чтобы данные находились на диске, используя то, что он был зарегистрирован (что намного быстрее, чем ждать fsync). # 2: ни в каком пункте я не упоминаю слово «диск» в любом месте моего сообщения. Мы с вами оба знаем, что с MongoDB получение данных на диск является второстепенным. –

+0

Кстати, если вы хотите сделать канонический ответ на этот вопрос, вы действительно имеете доступ к документации MongoDB. Поэтому вместо того, чтобы жаловаться на слово, которое я никогда не использовал, или на то, что я никогда не делал, почему бы не предоставить 100% -ный ответ на документы MongoDB? –

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