MongoDB特点

实用性

MongoDB 是一个面向文档的数据库,它并不是关系型数据库,直接存取 BSON,这意味着 MongoDB 更加灵活,因为可以在文档中直接插入数组之类的复杂数据类型,并且文档的 key 和 value 不是固定的数据类型和大小,所以开发者在使用 MongoDB 时无须预定义关系型数据库中的 ”表” 等数据库对象,设计数据库将变得非常方便,可以大大地提升开发进度。

可用性和负载均衡

MongoDB 在高可用和读负载均衡上的实现非常简洁和友好,MongoDB 自带了副本集的概念,通过设计适合自己业务的副本集和驱动程序,可以非常有效和方便地实现高可用,读负载均衡。

而在其他数据库产品中想实现以上功能,往往需要额外安装复杂的中间件,大大提升了系统复杂度,故障排查难度和运维成本。

扩展性

在扩展性方面,假设应用数据增长非常迅猛的话,通过不断地添加磁盘容量和内存容量往往是不现实的,而手工的分库分表又会带来非常繁重的工作量和技术复杂度。在扩展性上,MongoDB 有非常有效的,现成的解决方案。

通过自带的 Mongos 集群,只需要在适当的时候继续添加 Mongo 分片,就可以实现程序段自动水平扩展和路由,一方面缓解单个节点的读写压力,另外一方面可有效地均衡磁盘容量的使用情况。整个 mongos 集群对应用层完全透明,并可完美地做到各个 Mongos 集群组件的高可用性。

数据压缩

自从 MongoDB 3.0 推出以后,MongoDB 引入了一个高性能的存储引擎 WiredTiger,并且它在数据压缩性能上得到了极大的提升,跟之前的 MMAP 引擎相比,压缩比至少可增加5倍以上,可以极大地改善磁盘空间使用率。

其他特性

相比其他关系型数据库,MongoDB 引入了 ”固定集合” 的概念。所谓固定集合,就是指整个集合的大小是预先定义并固定的,内部就是一个循环队列,假如集合满了,MongoDB 后台会自动去清理旧数据,并且由于每次都是写入固定空间,可大大地提升写入速度。

这个特性就非常适用于日志型应用,不用再去纠结日志疯狂增长的清理措施和写入效率问题。另外需要更加精细的淘汰策略设置,还可以使用 TTL 索引(time-to-liveindex),即具有生命周期的索引,它允许为每条记录设置一个过期时间,当某条记录达到它的设置条件时可被自动删除。

在某些 LBS 的应用中,使用 MongoDB 也有非常巨大的优势。MongoDB 支持多种类型的地理空间索引,支持多种不同类型的地理空间查询,比如 intersection,within 和 nearness 等。