我一定是错的。我正在考虑在我的项目中使用 mongodb,但我读到了这个:
http://docs.mongodb.org/manual/faq/concurrency/#what-type-of-locking-does-mongodb-use
它说 mongodb 使用数据库级别的读写器锁。
MySQL InnoDB 使用行级锁定。嗯,这不是说,从理论上讲,mongodb 的并发访问要比 MySQL 慢 2 级吗?
我一定是错的。我正在考虑在我的项目中使用 mongodb,但我读到了这个:
http://docs.mongodb.org/manual/faq/concurrency/#what-type-of-locking-does-mongodb-use
它说 mongodb 使用数据库级别的读写器锁。
MySQL InnoDB 使用行级锁定。嗯,这不是说,从理论上讲,mongodb 的并发访问要比 MySQL 慢 2 级吗?
如果您查看读写器锁,您会发现它与 MySQL 在使用“行级锁定”一词时所指的数据库锁完全不同。
读写锁保护共享内存访问,因此寿命极短(微秒级)。由于在 MongoDB 中操作仅在文档级别上是原子的,因此这些锁(在传统数据库中它们有时被称为锁存器,用于保护索引访问)仅在单个文档需要在内存中更新时才会被持有。
常规的“数据库锁”通常会存在,直到正在进行的事务被提交或回滚。因为 RDBMS 事务可以跨越多个表的多个操作,所以这些锁的寿命通常要长得多,因此必须更加细化以允许其他工作发生并发。
这不是说,从理论上讲,mongodb 在并发访问方面比 MySQL 慢 2 级吗?
不,它确实没有,并且取决于您的确切工作负载可能快得多或快一点或慢一点 - 这完全取决于您正在执行的操作类型、可用的物理资源、数据的结构,以及作为您的应用程序的需要。
向 MongoDB 中的数据库写入大量数据的应用程序往往主要受到可用磁盘 IO 吞吐率的限制。只有当可用磁盘带宽超过应用程序对数据库的写入量时,您才会看到并发性成为 MongoDB 的一个因素。对于关系数据库,由于锁的生命周期更长,即使写入的总数据量相对较小,并发性也可以更早地成为一个因素。
是的,你完全正确,目前 MongoDB 实现了独占的 per-database 写锁,从并发的角度来看,这比 MySQL 的 MyISAM 存储引擎的 per-table 写锁更糟糕。
从这里:
从 2.2 版开始,MongoDB 在每个数据库的基础上为大多数读写操作实现锁。
在 2.2 版本之前情况更糟,因为它们每个mongod
实例使用一个全局锁。
PS: MongoDB 还使用映射到虚拟内存(不是物理 RAM)的内存映射文件,并且每秒将数据刷新到磁盘(没有日志记录)。使用预写日志(日志),数据也不是持久的,因为组提交是在特定时间间隔内执行的。因此,我们同时接收到非持久存储和非内存存储。