MongoDB的学习小结

MongoDB的学习小结

MongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB最大的特点就是他特有的查询语言功能十分强大,几乎可以实现类似关系数据库单表 查询的绝大部分功能。更难得可贵的是由于文档的结构是松散的,所以他的拓展性非常好,可以在开发过程中动态拓展文档结构,降低在传统开发中,表结构设计的难度,同时Mongodb也具有传统数据库的建立索引,主从备份和分片的功能。

MongoDB的几个关键点

非结构性

跟mysql一样,一个mongod服务可以有建立多个数据库,每个数据库可以有多张表,这里的表名叫collection,每个collection可以存放多个文档(document),每个文档都以BSON(binary json)的形式存放于硬盘中。跟关系型数据库不一样的地方是,它是以单文档为单位存储的,你可以任意给一个或一批文档新增或删除字段,而不会对其它文档造成影响,这就是所谓的schema-free,这也是文档型数据库最主要的优点。跟一般的key-value数据库不一样的是,它的value中存储了结构信息,所以你又可以像关系型数据库那样对某些域进行读写、统计等操作,从程序员的角度看,更加符合面向对象的概念。可以说是兼备了key-value数据库的方便高效与关系型数据库的强大功能。

关于面向对象的概念,我们可以举个例子,比如传统的 用户 角色,在关系型数据库中,一般要建立三个表,从用户名查出角色,也需要连表(join)查询,而在Mongodb中,可以将角色作为用户的一个属性存在用户文档中,只用用user.role就可以一次查询出来,效率提高了很多,但这种明显违反数据库三范式原则,因为每个用户都存储了角色这个信息,造成存储空间浪费,而且如果一个角色名称需要修改,那么传统型数据库只需要执行一个修改语句,而MongoDB则需要把每条相关用户都修改一次。针对这个问题,如果某个字段更新比较频繁,我们也可将其范式化,即将其单独拆分出来变成文档,原来那个文档存在这个新文档的引用,具体例子看下面。所以是使用内嵌文档还是应用数据需要结合具体业务。
pKEOEQ.md.jpg

索引

跟关系型数据库类似,mongodb可以对某个字段建立索引,可以建立组合索引、唯一索引,也可以删除索引,默认每个文档的_id就是一个唯一索引,而且针对索引优化的一些理论也基本与关系型数据库的索引优化理论差不多。当然建立索引就意味着增加空间开销,降低修改的速度。

Mongodb还有一些比较特殊的索引,比如说是TTL索引,可以将年龄大的文档移出系统。

Mongodb还存在全文本索引
但是对性能消耗较大,一般建议是在离线条件下建立全文本索引,全文本索引还支持多个键一起建立,而且可以给每个键设置权值来突出不同键的重要性。

GridFS

GridFS是Mongodb的一种存储机制,用来存储大型二进制文件,如果项目中已经使用Mongodb,那么可以使用GridFS来替代独立的文件存储工具,该存储机制也自带故障转移和横向拓展。(不知道可不可以将病人整体作为文档放入GridFS,对此进行索引?)

数据分析聚合

Mongodb提供 聚合框架 ,Mapreduce和 count,distinct,group 基本上能满足对数据的分析处理需求

副本集

Mongodb为了提高可靠性,也有副本集的概念,一个副本集中只有唯一的一个主服务器,用于处理客户请求,还有多个备份服务器,用于保存主节点的数据副本,当故障发生,节点会自动推选一个新的节点来作为主节点。副本集中还可能存在着隐藏节点(只有备份数据,对应用隐身的节点)和裁决节点(只用于投票),一般副本集不宜过大,一般十一个节点。

Mongodb还存在类似MySQL中半同步复制的机制,来调可靠性(降低点速度),(通过w参数的使用)
Mongodb 甚至还可以自定义复制的策略,可以根据项目的具体部署需求,来定制备份数据的物理位置。

最后,当对数据一致性要求不高的情况下,也可以将客户读的请求往备份节点发送,分担读的压力。

分片

Mongodb支持自动分片,但是要求片键上必须上建立索引
应用在达到具体分片上执行操作之前,需要先访问mongos 进行路由过程,然后再发往具体的分片上,这意味者,高效的查询一般需要查询条件尽量包含片键。而且由于mongos对应用隐藏了集群的细节,应用在代码层次上并不需要修改,拓展性比较好。具体示意图如下:

pMYfDe.jpg

同样也可以控制数据的的储存在哪些分片上,但书上貌似只写了基于数值范围的自定义分片分发机制,对于是否有枚举,hash的自定义分发机制还不清楚。

缺点

由于没有表的条件约束,所以数据之间的约束性必须要由应用来保证;MongoDB不支持事务操作,所以需要用到事务的应用建议不用MongoDB,另外MongoDB目前不支持join操作,需要复杂查询的应用也不建议使用MongoDB。

猜你喜欢

转载自blog.csdn.net/whp404/article/details/79048648
今日推荐