7

我一定是错的。我正在考虑在我的项目中使用 mongodb,但我读到了这个:

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

它说 mongodb 使用数据库级别的读写器锁。

MySQL InnoDB 使用行级锁定。嗯,这不是说,从理论上讲,mongodb 的并发访问要比 MySQL 慢 2 级吗?

4

2 回答 2

12

如果您查看读写器锁,您会发现它与 MySQL 在使用“行级锁定”一词时所指的数据库锁完全不同。

读写锁保护共享内存访问,因此寿命极短(微秒级)。由于在 MongoDB 中操作仅在文档级别上是原子的,因此这些锁(在传统数据库中它们有时被称为锁存器,用于保护索引访问)仅在单个文档需要在内存中更新时才会被持有。

常规的“数据库锁”通常会存在,直到正在进行的事务被提交或回滚。因为 RDBMS 事务可以跨越多个表的多个操作,所以这些锁的寿命通常要长得多,因此必须更加细化以允许其他工作发生并发。

这不是说,从理论上讲,mongodb 在并发访问方面比 MySQL 慢 2 级吗?

不,它确实没有,并且取决于您的确切工作负载可能快得多或快一点或慢一点 - 这完全取决于您正在执行的操作类型、可用的物理资源、数据的结构,以及作为您的应用程序的需要。

向 MongoDB 中的数据库写入大量数据的应用程序往往主要受到可用磁盘 IO 吞吐率的限制。只有当可用磁盘带宽超过应用程序对数据库的写入量时,您才会看到并发性成为 MongoDB 的一个因素。对于关系数据库,由于锁的生命周期更长,即使写入的总数据量相对较小,并发性也可以更早地成为一个因素。

于 2014-02-27T22:17:14.790 回答
-2

是的,你完全正确,目前 MongoDB 实现了独占的 per-database 写锁,从并发的角度来看,这比 MySQL 的 MyISAM 存储引擎的 per-table 写锁更糟糕。

这里

从 2.2 版开始,MongoDB 在每个数据库的基础上为大多数读写操作实现锁。

在 2.2 版本之前情况更糟,因为它们每个mongod实例使用一个全局锁。

PS: MongoDB 还使用映射到虚拟内存(不是物理 RAM)的内存映射文件,并且每秒将数据刷新到磁盘(没有日志记录)。使用预写日志(日志),数据也不是持久的,因为组提交是在特定时间间隔内执行的。因此,我们同时接收到非持久存储和非内存存储。

于 2013-10-12T04:22:36.377 回答