我最近第一次使用MongoDB,发现它非常易于使用且性能卓越.这引出了我的问题 - 为什么不是MongoDB?
让我们说我正在实施一个问答应用程序.我的方法是在MySQL数据库中实现用户数据,然后使用MongoDB进行问答存储 - 一个存储问题和所有响应的集合.
这种方法有什么问题吗?
geo*_*ane 33
MongoDB听起来像是一个很好的应用程序,但你有很多理由不使用它.
MongoDB不适合需要的应用程序:
joh*_*odo 19
MongoDB是一个很棒的数据库,我很喜欢使用它.也就是说,如果你来自SQL的世界,它有一些陷阱.
除了ACID和其他有充分记录的事情(以及其他答案),这些事情让我们感到惊讶:
MongoDB希望你有内存.很多记忆.如果你无法将你的工作集安装在内存中,你可以忘掉它.这与大多数只使用内存作为缓存的关系数据库不同! 更具体一点: MongoDB使用RAM作为主存储,并将不需要的部分"交换"到磁盘上(Mongo决定将哪些部分"交换"到内核).传统的RDBMS以相反的方式工作 - 它们使用磁盘作为主存储,并使用RAM作为缓存机制.所以一般来说MongoDB使用更多的RAM.这本身并不是一件坏事,但结果是"真正的" RAM消耗难以预测,一旦工作集超过(难以预测)的限制,就会导致严重且意外的性能下降.
删除记录时,存储不会自动收缩.每个集合分配的空间将保持分配状态,直到您使用repairDB或删除集合.它在数据库级别(数据文件)上以巨大的块分配,然后在需要时(扩展区)分配给集合.也就是说,在集合的已分配空间内,已删除的文档会为同一集合中的其他文档释放空间.这是对概念的一个很好的解释:http://www.10gen.com/presentations/storage-engine-internals
find():(公平地说,这可能是唯一理智的方法) - 但这是不使用SQL等基于字符串的语言的结果
db.test.find({}, {a:1})db.find({}, fields=[(a,1,)] 这不应被视为对MongoDB的批评 - 我喜欢使用它,它已被证明是一种可靠且高效的工具.但要正确使用它,您需要了解其空间管理.
可能的缺点:
MondoDB是一个很好的解决方案,适用于适用的情况.如果你可以使用它,为什么不呢?
添加其他给出的评论;选择数据存储(SQL 或 NoSQL)在很大程度上取决于您的复制要求。
MongoDB 遵循 MySQL 式的主-从-从-*(1 个主,多个从)配置。您只能写信给主人。
在地理分布式系统中,这可能是不可接受的(您需要能够写入任何主服务器并使服务器协调)。
在这些情况下,像 Cassandra、Riak、CouchDB 这样的服务器会更好。
话虽如此,如果 MySQL 非常适合您的应用程序并且您想使用 NoSQL,那么 Mongo 是完美的解决方案。
@johndodo 关于内存使用。他们在官方常见问题页面上说:
MongoDB 需要大量 RAM 吗?
不必要。当然可以在具有少量空闲 RAM 的机器上运行 MongoDB。MongoDB 自动使用机器上的所有空闲内存作为其缓存。系统资源监视器显示 MongoDB 使用了大量内存,但它的使用是动态的。如果另一个进程突然需要服务器一半的 RAM,MongoDB 将向另一个进程提供缓存内存。
从技术上讲,操作系统的虚拟内存子系统管理 MongoDB 的内存。这意味着 MongoDB 将使用尽可能多的空闲内存,并根据需要交换到磁盘。具有足够内存以适应 RAM 中应用程序工作数据集的部署将实现最佳性能。
所以我认为,学习曲线就是答案。您对技术了解得越多 - 您的系统就会越好。