2013-10-12 2 views
6

Должно быть, я ошибаюсь. Я рассматриваю возможность использования MongoDB в моем проекте, но я прочитал это:Блокировка уровня базы данных на mongodb?

http://docs.mongodb.org/manual/faq/concurrency/#what-type-of-locking-does-mongodb-use

Он говорит, что MongoDB использует на уровень базы данных блокировки читателя писатель.

MySQL InnoDB использует блокировку на уровне строк. Ну, разве это не значит, теоретически, mongodb на 2 уровня медленнее, чем MySQL для одновременного доступа?

ответ

-2

Да, вы абсолютно правы, в настоящее время MongoDB реализует исключительную блокировку записи по каждой базе данных, что еще хуже с точки зрения параллелизма, чем блокировки записи в хранилище MySQL MyISAM.

От here:

Начиная с версии 2.2, MongoDB реализует замки на каждой базы данных основе для большинства операций чтения и записи.

До версии 2.2 это было еще хуже, потому что они используют один глобальный замок в целом mongod экземпляр.

P.S .: Также MongoDB использует файлы с отображением памяти, которые сопоставляются с виртуальной памятью (а не физической оперативной памятью) и сбрасывают данные на диск каждую секунду (без ведения журнала). С журналом записи вперед (журнал) данные также не долговечны, потому что групповые фиксации выполняются через определенные промежутки времени. Таким образом, мы получаем не долговременное, а не запоминающее устройство в одно и то же время.

+1

Блокировка не где-то рядом с плохим или худшим, чем у MySQL, поскольку один замок MongoDBs является мьютексом, ваш ps просто ошибочен в распространенном заблуждении – Sammaye

+0

@Sammaye Можете ли вы более подробно объяснить разницу? – zavg

+0

, так как он не имеет изолированного замка, на самом деле единственное, что он имеет для блокировки, это то, что он удерживает его, пока операция на самом деле записывается в файлы данных, в отличие от MySQL, который имеет изолированную блокировку на время транзакции, это является I в ACID и одной из причин, по которым MySQL и другие технические специалисты SQL нуждаются в блокировке на уровне строк. – Sammaye

10

Если вы посмотрите на блокировку читателей-писателей, вы обнаружите, что это совершенно другой тип животных, чем блокировка базы данных, на которую ссылается MySQL, когда вы используете фразу «блокировка уровня строки».

Readers-writer lock защищает доступ к общей памяти и поэтому чрезвычайно короткий (порядка микросекунд). Поскольку в MongoDB операции только атомарны на уровне документа, эти блокировки (в традиционных базах данных они sometimes referred to as latches и используются to guard index access) сохраняются только до тех пор, пока один документ берет для обновления в памяти.

Обычная «блокировка базы данных» обычно существует до тех пор, пока транзакция, которая выполняется, не была зафиксирована или не откатна. Поскольку транзакции RDBMS могут охватывать несколько операций во многих таблицах, эти блокировки обычно намного более долговечны, и поэтому должен быть намного более гранулированным, чтобы позволить другой совместной работе выполнять параллелизм.

Это не значит, теоретически, mongodb на 2 уровня медленнее, чем MySQL для одновременного доступа?

Нет, это действительно так, и в зависимости от вашей точной рабочей нагрузки может быть намного быстрее или немного быстрее или медленнее - все зависит от типов операций, которые вы делаете, от имеющихся физических ресурсов, от структуры ваших данных, а также потребностей вашего приложения.

Приложения, которые записывают много данных в базу данных в MongoDB, как правило, ограничены в основном доступной пропускной способностью ввода-вывода IO. Только когда доступная полоса пропускания диска превышает количество записей, сделанных приложением в базе данных, вы увидите, что параллелизм становится фактором с MongoDB.С реляционными базами данных, из-за более длительного срока службы блокировок, параллелизм может стать фактором намного раньше даже при относительно небольшом количестве всех записываемых данных.

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