深入浅出MongoDB
Posted 秃头让我们变强
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入浅出MongoDB相关的知识,希望对你有一定的参考价值。
一
简介
MongoDB是一种强大、灵活、可扩展的数据存储方式。它扩展了关系型数据库的众多有用功能,如辅助索引、范围查询(range query)和排序。MongoDBd的功能非常丰富,比如内置的对MapReduce式聚合的支持,以及对地理空间索引的支持。
MongoDB是面向文档的数据库,不是关系型数据库。放弃关系模型的模型的主要原因是为了获得更加方便的扩展性,当然还有其他好处。
基本思路就是将传统关系型数据库的“行”(row)的概念换成更加灵活的“文档”(document)模型。
“行”数据样例
MongoDB“文档”数据样例
面向文档的方式可以将文档或者数组内嵌到文档中,一条记录就可以表示非常复杂的层次关系,这对面向对象语言开发者非常友好。
由于MongoDB没有模式,文档的键(这里指对象的属性键)不会事先定义也不会固定不变。由于没有模式需要更改,通常不需要迁移大量数据。不必将所有的数据都放在一个模子里面,应用层可以处理新增或者丢失的键。这样开发者可以非常容易变更数据模型。
随着目前软硬件技术的飞速发展,应用数据集的大小飞速增加,T级别甚至PB级别的数据随处可见。
随着存储的数据不断增长,开发者经常碰到的问题就是:该如何扩展数据库呢?解决方案通常是,升级(买台更好的机器,更大的内存,更多的SSD存储空间等)或者扩展(将数据分散到其他机器上,读写分离,分库分表等)。
从成本上考虑,升级往往需要购置更昂贵的机器。而扩展不仅经济,还可以持续添加;想要增加存储空间或者提升性能,只需要再买一台一般的服务器加入集群就可以了。
MongoDB从最初设计的时候就考虑到了扩展的问题。它采用的面向文档的数据模型使其可以自动在多台服务器之间分割数据。它还可以平衡集群的数据和负载,自动重排文档。
这样做的好处可以让开发者专注于编写应用,而不是考虑如何扩展。如果需要更大的容量,只需要向集群中添加新机器,然后让数据库来处理剩下的事。
索引
MongoDB支持通用辅助索引,能进行多种快速查询,也提供唯一的、复合的和地理空间索引能力。
开发人员不必使用存储过程了,可以直接在服务端存取JavaScript的函数和值。
聚合
MongoDB支持MapReduce和其他整合工具。
固定集合
集合的大小是有上限的,这对某些类型的数据(比如日志)特别有用。
文件存储
MongoDB支持用一种容易使用的协议存储大型文件和文件的元数据。
说明:有些关系型数据库的常见功能MongoDB并不具备,比如联结(join)。这个架构上的考虑是为了提高扩展性,在分布式系统上很难实现部分功能。
卓越的性能是MongoDB的主要目标,也极大地影响了设计上的很多决定。MongoDB使用MongoDB传输协议作为与服务器交互的主要方式(目的是减少开销,与之对应的协议需要更多的开销,如HTTP/REST)。
它对文档进行动态填充,预分配数据文件。用空间换取性能的稳定,默认的存储引擎使用了内存映射文件,将内存管理工作交给操作系统去处理。动态查询优化器会“记住”执行查询最高效的方式。
MongoDB功能强大,尽量保持关系型数据库的众多特性,但是它并不是要具备所有的关系型数据库的功能。它尽可能将服务器端处理逻辑交给客户端(由驱动程序或者用户的应用数据处理)。这样精简的设计使得MongoDB获得了非常好的性能。
MongoDB尽量让服务器自治来简化数据库的管理。除了启动数据库服务器之外,几乎没有什么必要的管理操作。如果主服务器挂掉了,MongoDB会自动切换到备份服务器上,并且将备份服务器提升为活跃服务器。在分布式环境下,集群只需要知道有新增加的节点,就会自动集成和配置新节点。
以上内容:节选自《MongoDB权威指南》
二
下一期内容
文档
集合
数据库
MongoDB启动
数据类型
三
推荐阅读
《MongoDB权威指南》
《深入学习MongoDB》
以上是关于深入浅出MongoDB的主要内容,如果未能解决你的问题,请参考以下文章