≡ ̄﹏ ̄≡

与关系型数据库相比,MongoDB的优点:

① 弱一致性(最终一致),更能保证用户的访问速度。

② 文档结构的存储方式(类JSON数据模式简单而强大),能够更便捷的获取数据。

③ 全索引支持,扩展到内部对象和内嵌数组。

④ 内置GridFS,支持大容量的存储。
GridFS是一个出色的分布式文件系统,可以支持海量的数据存储。
内置了GridFS了MongoDB,能够满足对大数据集的快速范围查询。

⑤ 内置Sharding。
提供基于Range的Auto Sharding机制:一个collection可按照记录的范围,分成若干个段,切分到不同的Shard上。

⑥ 第三方支持丰富。(这是与其他的NoSQL相比,MongoDB也具有的优势)
现开源文档数据库MongoDB背后有商业公司10gen为其提供供商业培训和支持,而且MongoDB社区非常活跃,很多开发框架都迅速提供了对MongDB的支持。

⑦ 性能优越:
在使用场合下,千万级别的文档对象,近10G的数据,对有索引的ID的查询不会比mysql慢,而对非索引字段的查询,则是全面胜出。

与关系型数据库相比,MongoDB的缺点:

① mongodb不支持事务操作,所以事务要求严格的系统(如果银行系统)肯定不能用它。(这点和优点①是对应的)

② mongodb占用空间过大。

关于其原因,在官方的FAQ中,提到有如下几个方面:
1、空间的预分配:为避免形成过多的硬盘碎片,mongodb每次空间不足时都会申请生成一大块的硬盘空间,而且申请的量从64M、128M、256M那样的指数递增,直到2G为单个文件的最大体积。随着数据量的增加,你可以在其数据目录里看到这些整块生成容量不断递增的文件。

2、字段名所占用的空间:为了保持每个记录内的结构信息用于查询,mongodb需要把每个字段的key-value都以BSON的形式存储,如果 value域相对于key域并不大,比如存放数值型的数据,则数据的overhead是最大的。一种减少空间占用的方法是把字段名尽量取短一些,这样占用空间就小了,但这就要求在易读性与空间占用上作为权衡了。我曾建议作者把字段名作个index,每个字段名用一个字节表示,这样就不用担心字段名取多长了。但作者的担忧也不无道理,这种索引方式需要每次查询得到结果后把索引值跟原值作一个替换,再发送到客户端,这个替换也是挺耗费时间的。现在的实现算是拿空间来换取时间吧。

3、删除记录不释放空间:这很容易理解,为避免记录删除后的数据的大规模挪动,原记录空间不删除,只标记“已删除”即可,以后还可以重复利用。

4、可以定期运行db.repairDatabase()来整理记录,但这个过程会比较缓慢

③ MongoDB没有如MySQL那样成熟的维护工具,这对于开发和IT运营都是个值得注意的地方。