最近项目在使用MongoDB作为图片和文档的存储数据库,为啥不直接存MySQL里,还要搭个MongoDB集群,麻不麻烦?
让我们一探究竟,了解一下MongoDB的特点和基本用法 。
三分钟你将学会:
- MongoDB主要特征
- MongoDB优缺点,扬长避短
- 何时选择MongoDB?为啥要用它?
- MongoDB与MySQL关键字对比
- 下载与安装过程中一些常见的坑
- JAVA整合MongoDB,实现农民工增删改查
MongoDB是一款开源、跨平台、分布式,具有大数据处理能力的文档存储数据库 。文档数据库MongoDB用于记录文档结构的数据,比如JSON、XML结构的数据 。
二、MongoDB的主要特征
- 高性能 。提供JSON、XML等可嵌入数据快速处理功能,提供文档的索引功能,以提高查询速度;
- 丰富的查询语言 。为数据聚合、结构文档、地理空间提供丰富的查询功能;
- 高可用性 。提供自动故障转移和数据冗余处理功能;
- 水平扩展能力 。提供基于多服务器集群的分布式数据处理能力,具体处理时分「主从」和「权衡」(基于Hash自动推选)两种处理模式;
- 支持多种存储引擎 。MongoDB提供多种存储引擎,WiredTiger引擎、MMAPv1引擎是基于硬盘读写的存储引擎,In-Memory引擎是基于内存的存储引擎 。
1、优点
- Free-schema无模式文档,适应非结构化数据存储;
- 内置GridFS,支持大容量的存储;
- 内置Sharding,分片简单
- 弱一致性(最终一致),更能保证用户的访问速度;
- 查询性能优越,对于千万级别的文档对象,差不多10个G,对有索引的ID的查询不会比MySQL慢,而对非索引字段的查询,则是完胜MySQL;
- 聚合框架,它支持典型几种聚合操作 , 比如,Aggregate pipelien, Map-Reduce等;
- 支持自动故障恢复
- 太吃内存,快是有原因的,因为MongoDB把数据都放内存里了;
- 对事务的支持不够友好;
- 占用空间过大;
- 对联表查询的支持不够强大;
- 只有最终一致性,言外之意,就是可能造成数据的不一致,如果想要保持强一致性,必须在一个服务器处理所有的读写操作,坑;
- 复杂聚合操作通过mapreduce创建,速度慢
- Mongodb全局锁机制也是个坑;
- 预分配模式会带来的磁盘瓶颈;
- 删除记录时不会释放空间,相当于逻辑删除,这个真的坑;
- MongoDB到现在为止,好像还没有太好用的客户端工具 。
为啥要用它?
MongoDB事务
MongoDB目前只支持单文档事务,MongoDB暂时不适合需要复杂事务的场景 。灵活的文档模型JSON格式存储最接近真实对象模型,对开发者友好,方便快速开发迭代,可用复制集满足数据高可靠、高可用的需求,运维较为简单、故障自动切换可扩展分片集群海量数据存储 。
多引擎支持各种强大的索引需求
支持地理位置索引
可用于构建各种O2O应用
文本索引解决搜索的需求
TTL索引解决历史数据过期的需求
Gridfs解决文件存储的需求
aggregation & mapreduce解决数据分析场景需求,可以自己写查询语句或脚本,将请求分发到 MongoDB 上完成 。
具体的应用场景
传统的关系型数据库在解决三高问题上的力不从心 。何为三高?
- High performance - 对数据库高并发读写的需求 。
- Huge Storage - 对海量数据的高效率存储和访问的需求 。
- High Scalability && High Availability- 对数据库的高可扩展性和高可用性的需求 。
以下是几个实际的应用案例:
1)游戏场景
使用MongoDB存储游戏用户信息、装备、积分等,直接以内嵌文档的形式存储,方便查询、更新 。
2)物流场景
使用MongoDB存储订单信息、订单状态、物流信息,订单状态在运送过程中飞速迭代、以MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更查出来,牛逼plus 。
3)社交场景
使用MongoDB存储用户信息,朋友圈信息,通过地理位置索引实现附近的人、定位功能 。
4)物联网场景
使用MongoDB存储设备信息、设备汇报的日志信息、并对这些信息进行多维度分析 。
5)视频直播
使用MongoDB存储用户信息、点赞互动信息 。
选择MongoDB的场景总结