我最近第一次使用MongoDB,发现它非常易于使用且性能卓越。这引出了我的问题 - 为什么不是MongoDB?
让我们说我正在实施Q&一个应用程序我的方法是在MySQL数据库中实现用户数据,然后使用MongoDB进行问答存储 - 一个存储问题和所有响应的集合。
这种方法有什么问题吗?
答案 0 :(得分:33)
MongoDB听起来像是一个很好的应用程序,但你有很多理由不使用它。
MongoDB不适合需要的应用程序:
答案 1 :(得分:19)
MongoDB是一个出色的数据库,我很喜欢使用它。也就是说,如果你来自SQL的世界,它有一些陷阱。
除了ACID和其他有充分记录的事情(以及其他答案),这些事情让我们感到惊讶:
MongoDB希望你有内存。 很多记忆。如果你无法将你的工作集安装在内存中,你可以忘掉它。这与大多数只使用内存作为缓存的关系数据库不同! 更具体一点: MongoDB使用RAM作为主存储,并将不需要的部分“交换”到磁盘上(Mongo决定将哪些部分“交换”到内核)。传统的RDBMS以相反的方式工作 - 它们使用磁盘作为主存储,并使用RAM作为缓存机制。所以一般来说MongoDB使用更多的RAM。这本身并不是一件坏事,但结果“真正的” RAM消耗难以预测,一旦工作集超过(很难),就会导致严重且意外的性能下降。预测)限制。
存储不会自动缩小。每个集合分配的空间将保持分配,直到您repair
DB或删除集合。它在数据库级别(数据文件)上以巨大的块分配,然后在需要时分配给集合( extents )。也就是说,在集合的已分配空间内,已删除的文档会为同一集合中的其他文档释放空间。这是对概念的一个很好的解释:http://www.10gen.com/presentations/storage-engine-internals
find()
将返回哪些字段:(公平地说,这可能是唯一的理智的做法 - 但这是不使用SQL等基于字符串的语言的结果
db.test.find({}, {a:1})
db.find({}, fields=[(a,1,)]
这不应被视为对MongoDB的批评 - 我喜欢使用它,它已被证明是一种可靠且高效的工具。但要正确使用它,你需要了解它的空间管理。
答案 2 :(得分:8)
可能的缺点:
MondoDB是一个很好的解决方案,适用于适用的情况。如果你可以使用它,为什么不呢?
答案 3 :(得分:4)
@johndodo关于内存使用情况。 他们在官方常见问题解答页面上说:
MongoDB是否需要大量内存?
不一定。在机器上运行MongoDB当然是可能的 有少量的免费RAM。 MongoDB自动使用所有免费的 机器上的内存作为缓存。系统资源监视器显示 MongoDB使用了大量内存,但它的用法是动态的。如果另一个 进程突然需要服务器的一半RAM,MongoDB会产生 将内存缓存到其他进程。
从技术上讲,操作系统的虚拟内存子系统可以管理 MongoDB的记忆。这意味着MongoDB将使用尽可能多的可用内存 尽可能根据需要交换到磁盘。具有足够内存的部署 在RAM中适应应用程序的工作数据集将达到最佳效果 性能
所以我认为,学习曲线就是答案。你越了解技术 - 你的系统就越好。
答案 4 :(得分:3)
我一直在研究几个基于SQL DB的系统,经过3年以上的mongodb(使用Rails mongoid驱动程序),我有三个主要原因。
答案 5 :(得分:2)
我找不到从用户信息中提取所有数据的理由。到q& a MongoDB中的一个,除了一个实际原因:
在共享托管环境中,不容易找到服务提供商提供的MongoDB托管。与mySql不同,它成为托管计划的标准。
答案 6 :(得分:2)
添加其他评论;决定数据存储(SQL或NoSQL)在很大程度上取决于您的复制要求。
MongoDB遵循MySQL-esque master-slave-slave- *(1个主从,多个从属)配置。你只能写信给主人。
在地理位置分散的系统中,这可能是不可接受的(您需要能够写入任何主服务器并让服务器协调)。
在这些情况下,像Cassandra,Riak,CouchDB这样的服务器在这些情况下会更好。
所有这一切,如果MySQL非常适合您的应用,并且您想使用NoSQL,Mongo是完美的解决方案。
答案 7 :(得分:0)
在为我的项目决定数据库时,我听说mongoDB是免费的,然后我想为什么不是mongoDB?
好吧,为了更加确定我打电话给MongoDB客户支持团队。 目前有三种不同版本的MongoDB。
实际上社区服务器是免费的,其他2是付费软件。
我问那个人 -
我在哪里可以使用mongodb的社区服务器?
低于我通过电子邮件收到的回复 -
社区服务器建议用于开发环境。用于生产目的 企业提供是必需的。
使用版本前请确定。
希望这会对你有所帮助:)。