MongoDB 是目前主流的 NoSQL 数据库之一,由 C++ 语言编写,与关系型数据库和其它的 NoSQL 不同,MongoDB 使用了面向文档的数据存储方式,将数据以类似JSON的方式存储在磁盘上。
前言:NoSQL与RDBMS的区别
- NoSQL是非关系型数据库,相比传统的RDBMS(Relational Database Management System)只能支持高度结构化的数据(预先定义表结构),NoSQL支持的数据结构更加灵活(几乎不需要预先定义数据结构),因此节省了一些时间和空间上的开销;
- NoSQL中不需要维护数据之间的关系,不支持
join
操作,仅追求最终一致性,因此更加容易水平扩展。而RDB的很多操作(比如事务)还是依赖于单机系统,保证强一致性,因此不容易水平扩展 - 由于NoSQL非常利于分布式部署,因此它的特点是能支持大数据量(TB级)、高可用(CAP理论)
特性
- 分布式场景:高可用、大数据量
- 面向文档的数据库:存储的数据结构非常灵活,对于插入的文档的数据结构没有任何限制,同一张表里也能存储不同结构的记录;文档解析性能非常优秀,适用于结构复杂的一些数据(比如层层嵌套的json数据);
- 介于非关系型数据库和关系型数据库之间:作为NoSQL数据库,同时还支持一些类似SQL的查询方式,比如按字段查询、范围查询、正则表达式查询、聚合查询等,使得数据查询也很方便;
MongoDB 是专为可扩展性、高性能、高可用而设计的数据库:
- 它可以从单服务器部署扩展到大型、复杂的多数据中心架构。
- 利用内存计算的优势,MongoDB能够提供高性能的数据读写操作。
- MongoDB的本地复制和自动故障转移功能使应用程序具有企业级的可靠性和操作灵活性。
高可用
MongoDB的复制工具(称为副本集)提供:
- 自动故障转移
- 数据冗余
副本集是一组维护相同数据集合的 mongod 实例,提供了冗余和提高了数据可用性。
可扩展
MongoDB 采用 横向扩展,通过分片(shard)将数据分散到更多的机器上。面向文档的数据模型使它更容易地在多台服务器之间进行数据分割。MongoDB 能自动处理跨集群的数据和负载,自动重新分配文档,以及将用户请求路由到正确的机器上。
高性能
MongoDB 提供高性能的数据持久化。特别是:
- 对嵌入式数据模型的支持减少了数据库系统上的
I/O
操作。 - 索引支持更快的查询,并且索引可以包含来自嵌入式文档\数组的键。
- MongoDB 能对文档进行动态填充,也能预分配数据文件以利用额外的空间来换取稳定的性能。
- MongoDB 把尽可能多的内存作为cache,试图为每次查询选择正确的索引。
功能丰富
MongoDB 作为一款通用型数据库,支持以下特性:
- 索引:支持通用二级索引,提供唯一索引、复合索引、地理空间索引,以及全文索引。
- 聚合:支持聚合管道,用户能通过简单的分片创建复杂的聚合,并通过数据库自动优化。
- 支持存在时间有限的集合,适用于将在某个时刻过期的数据。
- 支持固定大小的集合,用于保存近期数据。
- 支持一种非常易用的协议,用于存储大文件和文件元数据。
不支持连接 join、复杂的多行事务,因为在分布式系统中这两个功能难以高效地实现。
参考
MongoDB/WT引擎学习指引 MongoDB/WT engine learning guide MongoDB整体
- ♥MongoDB教程 - Mongo知识体系详解♥
- 了解 MongoDB 看这一篇就够了 - 知乎
- MongoDB分享 基础概念
- NoSql的易扩展性
- 『浅入浅出』MongoDB 和 WiredTiger - 面向信仰编程 WiredTiger简介
- 官方文档-WT简介
- 解密未来数据库设计:MongoDB新存储引擎WiredTiger实现(事务篇) WiredTiger – 数据页
- 7-10倍写入性能提升:剖析WiredTiger数据页无锁及压缩黑科技(感觉很难读)
- WiredTiger系列1:数据页详解-CSDN WiredTiger – Cache Eviction
- WiredTiger系列2:Eviction详解-CSDN博客
- MongoDB 3.0挂起原因?WiredTiger实现:一个LRU cache深坑引发的分析