哪些场景下使用MongoDB

本文对比了MongoDB与MySQL的特点,MongoDB适用于大数据量、高读写性能需求的场景,尤其在处理JSON格式数据和自动故障转移方面表现优异。然而,它在事务处理、索引和空间占用方面存在不足。

为什么需要MongoDB

MongoDB与MySQL的区别

关于MongoDB与MySQL的区别可以参考网上关于NoSQL与MySQL的区别,以下是找到的网上的关于两者区别的截图:

 

总体上讲:

由于MongoDB独特的数据处理方式,可以将热点数据加载到内存,故而对查询来讲,会非常快(当然也会非常消耗内存);同时由于采用了BSON的方式存储数据,故而对JSON格式数据具有非常好的支持性以及友好的表结构修改性,文档式的存储方式,数据友好可见;数据库的分片集群负载具有非常好的扩展性以及非常不错的自动故障转移(大赞)。

不足:数据库的查询采用了特有的查询方式,有一定的学习成本(不高);索引不咋滴;锁只能提供到collection级别,还做不到行级锁;没有事务机制(不能回滚啊);学习资料肯定没有MySQL的多。

MongoDB与Hadoop的区别

MongoDB侧重于对数据进行操作的应用系统,而Hadoop则侧重于对数据进行分析统计的应用。 
MongoDB能够满足对数据库读写性能具有极高要求的应用场景(很消耗memory的),一般这些应用的响应延迟会要求控制在10ms以下,甚至更低。而Hadoop由于每一次的读写操作会包含大量数据(Hadoop更适合少次操作大批量数据的场景),通过聚集分析处理大量数据,这种分析一般都会走MapReduce,会造成很高的延迟(数分钟到数小时不等)

不适合MongoDB的场景

如果业务中存在大量复杂的事务逻辑操作,则不要用MongoDB数据库

MongoDB能为我解决哪些问题

一般来讲,我会将MySQL中的部分表迁移到MongoDB中,主要是涉及到车辆历史轨迹以及温湿度数据等机器采集到的数据,而订单数据、客户数据等信息,仍然放到MySQL数据库中,主要是因为这两类数据实时采集,实时更新,会随着时间的推移,项目的扩大(PAAS服务),造成非常巨大的数据量,而一般MySQL在单表数据量超过500万后,性能就会下降的比较快,虽然可以通过分表的方式进行处理,但是随着时间的增长,仍然会给我带来比较大的麻烦(如查询等),这样,就不如将其放到MongoDB中存储,查询什么的都会比较方便,不过需要注意根据片键分片哦。

在开发过程中遇到问题如何求助

常见的问题一般都可以在网上找到答案。 
可以百度搜索如https://segmentfault.com/t/mongodb,github之类的网站查找对应的问题

参考链接

http://www.cnblogs.com/eternal1025/p/5419905.html

 

mongodb与关系型数据库相比的优缺点

与关系型数据库相比,MongoDB的优点:

 

①弱一致性(最终一致),更能保证用户的访问速度:
举例来说,在传统的关系型数据库中,一个COUNT类型的操作会锁定数据集,这样可以保证得到“当前”情况下的较精确值。这在某些情况下,例 如通过ATM查看账户信息的时候很重要,但对于Wordnik来说,数据是不断更新和增长的,这种“较精确”的保证几乎没有任何意义,反而会产生很大的延 迟。他们需要的是一个“大约”的数字以及更快的处理速度。
但某些情况下MongoDB会锁住数据库。如果此时正有数百个请求,则它们会堆积起来,造成许多问题。我们使用了下面的优化方式来避免锁定:
每次更新前,我们会先查询记录。查询操作会将对象放入内存,于是更新则会尽可能的迅速。在主/从部署方案中,从节点可以使用“-pretouch”参数运行,这也可以得到相同的效果。 

使用多个mongod进程。我们根据访问模式将数据库拆分成多个进程。 

②文档结构的存储方式,能够更便捷的获取数据。

对于一个层级式的数据结构来说,如果要将这样的数据使用扁平式的,表状的结构来保存数据,这无论是在查询还是获取数据时都十分困难。

③内置GridFS,支持大容量的存储。

  GridFS是一个出色的分布式文件系统,可以支持海量的数据存储。

  内置了GridFS了MongoDB,能够满足对大数据集的快速范围查询。

④内置Sharding。

提供基于Range的Auto Sharding机制:一个collection可按照记录的范围,分成若干个段,切分到不同的Shard上。
Shards可以和复制结合,配合Replica sets能够实现Sharding+fail-over,不同的Shard之间可以负载均衡。查询是对 客户端是透明的。客户端执行查询,统计,MapReduce等操作,这些会被MongoDB自动路由到后端的数据节点。这让我们关注于自己的业务,适当的 时候可以无痛的升级。MongoDB的Sharding设计能力较大可支持约20 petabytes,足以支撑一般应用。

这可以保证MongoDB运行在便宜的PC服务器集群上。PC集群扩充起来非常方便并且成本很低,避免了“sharding”操作的复杂性和成本。

⑤第三方支持丰富。(这是与其他的NoSQL相比,MongoDB也具有的优势)

现在网络上的很多NoSQL开源数据库完全属于社区型的,没有官方支持,给使用者带来了很大的风险。
而开源文档数据库MongoDB背后有商业公司10gen为其提供供商业培训和支持。

而且MongoDB社区非常活跃,很多开发框架都迅速提供了对MongDB的支持。不少知名大公司和网站也在生产环境中使用MongoDB,越来越多的创新型企业转而使用MongoDB作为和Django,RoR来搭配的技术方案。

⑥性能优越:

在使用场合下,千万级别的文档对象,近10G的数据,对有索引的ID的查询不会比mysql慢,而对非索引字段的查询,则是全面胜出。 mysql实际无法胜任大数据量下任意字段的查询,而mongodb的查询性能实在让我惊讶。写入性能同样很令人满意,同样写入百万级别的数 据,mongodb比我以前试用过的couchdb要快得多,基本10分钟以下可以解决。补上一句,观察过程中mongodb都远算不上是CPU杀手。

 

与关系型数据库相比,MongoDB的缺点:

①mongodb不支持事务操作。

  所以事务要求严格的系统(如果银行系统)肯定不能用它。(这点和优点①是对应的)

②mongodb占用空间过大。

  关于其原因,在官方的FAQ中,提到有如下几个方面:
1、空间的预分配:为避免形成过多的硬盘碎片,mongodb每次空间不足时都会申请生成一大块的硬盘空间,而且申请的量从64M、128M、256M那 样的指数递增,直到2G为单个文件的较大体积。随着数据量的增加,你可以在其数据目录里看到这些整块生成容量不断递增的文件。
2、字段名所占用的空间:为了保持每个记录内的结构信息用于查询,mongodb需要把每个字段的key-value都以BSON的形式存储,如果 value域相对于key域并不大,比如存放数值型的数据,则数据的overhead是较大的。一种减少空间占用的方法是把字段名尽量取短一些,这样占用 空间就小了,但这就要求在易读性与空间占用上作为权衡了。我曾建议作者把字段名作个index,每个字段名用一个字节表示,这样就不用担心字段名取多长 了。但作者的担忧也不无道理,这种索引方式需要每次查询得到结果后把索引值跟原值作一个替换,再发送到客户端,这个替换也是挺耗费时间的。现在的实现算是 拿空间来换取时间吧。
3、删除记录不释放空间:这很容易理解,为避免记录删除后的数据的大规模挪动,原记录空间不删除,只标记“已删除”即可,以后还可以重复利用。

4、可以定期运行db.repairDatabase()来整理记录,但这个过程会比较缓慢

③MongoDB没有如MySQL那样成熟的维护工具,这对于开发和IT运营都是个值得注意的地方。

MongoDB适合存储一些关系简单、数据量又很大的数据,比如我们的平台上虚拟机的监控信息,包括内存、IO、CPU、网络等数据,每隔几秒就采集一次数据,每周、每月,量很大,而且旧的监控数据也不会保留太长时间,就使用的mongodb来存储这些数据;
另外mongodb的集群部署相对比较简单,易于扩展;比如主从复制,在mongo.conf配置几个参数就OK了;分片集群的配置也比较简单。还支持使用命令行来进行动态地添加和删除节点;

Mongodb的优点与不足
(1)Mongodb的不足之处
1、在集群分片中的数据分布不均匀
2、单机可靠性比较差
3、大数据量持续插入,写入性能有较大波动
4、磁盘空间占用比较大
(2)Mongodb的过人之处
1、无模式
2、查询与索引方式灵活,是最像SQL的Nosql
3、支持复制集、主备、互为主备、自动分片等特性


Mongodb与redis相比较:
 

mongoDB 源码语言是C++,redis也是C或C++,

mongodb 文件存储是BSON格式类似JSON,或自定义的二进制格式。

mongodb与redis性能都很依赖内存的大小,mongodb 有丰富的数据表达、索引;最类似于关系数据库,支持丰富的查询语言,redis数据丰富,较少的IO ,这方面mongodb优势明显。

 

mongodb不支持事物,靠客户端自身保证,redis支持事物,比较弱,仅能保证事物中的操作按顺序执行,这方面 redis优于mongodb。

mongodb对海量数据的访问效率提升,redis 较小数据量的性能及运算,这方面 mongodb性能优于redis .monbgodb 有mapredurce功能,提供数据分析,redis 没有 ,这方面 mongodb优于redis 。

<think> 我们讨论在什么场景下适合使用MongoDBMongoDB是一个基于分布式文件存储的NoSQL数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB适合的场景通常包括: 1. 大数据量、高并发、弱事务的互联网应用:MongoDB的文档模型自然、易扩展,性能较高,适合存储非结构化或半结构化的数据。 2. 需要灵活的数据模型:MongoDB是模式自由的,字段可以自由扩展,特别适合需求变化快、迭代频繁的应用。 3. 数据缓存:由于MongoDB可以提供高性能的读写,可用作缓存层,存储临时数据或会话信息。 4. 地理位置信息存储与查询:MongoDB支持二维空间索引,可以高效地执行地理位置查询。 5. 日志和事件数据存储:MongoDB的高吞吐写入能力适合存储日志、事件数据等。 6. 内容管理系统和博客平台:这些应用通常需要灵活的内容结构,MongoDB的文档模型可以很好地适应。 然而,MongoDB不适合的场景包括: 1. 需要高度事务支持的系统(如银行系统):MongoDB在4.0版本后支持了多文档事务,但性能会受到影响,对于复杂事务还是推荐关系型数据库。 2. 复杂的多表关联查询:MongoDB的关联查询(如$lookup)能力有限,复杂关联查询不如关系型数据库高效。 3. 需要复杂SQL查询的场景MongoDB的查询语言与SQL不同,对于复杂的查询可能不如SQL直观和强大。 以下是一个简单的使用Python操作MongoDB的示例,展示如何连接数据库,插入文档和查询文档。 首先,确保已安装pymongo:`pip install pymongo` </think> ### MongoDB 适用场景分析 MongoDB 作为 NoSQL 数据库的代表,在以下场景中表现优异: #### ✅ **适合使用 MongoDB场景** 1. **半结构化/非结构化数据** - 如日志、传感器数据、用户行为记录等动态模式数据。 - 示例:存储不同结构的用户行为日志(字段可能动态增减)。 2. **高读写并发场景** - 支持水平扩展(分片集群),适合高吞吐量应用(如实时分析、IoT)。 3. **快速迭代开发** - 无需预定义 Schema,适合敏捷开发中频繁变更的数据模型。 4. **地理位置服务** - 内置 `2dsphere` 地理空间索引,支持附近地点查询。 5. **大文件存储** - 通过 GridFS 存储大型文件(如图片、视频)。 #### ❌ **不适合的场景** - 需要复杂事务(如金融系统) - 强关系型数据(多表 JOIN 操作) - 严格的一致性要求(MongoDB 优先保证可用性) --- ### 示例代码:MongoDB 快速实践(Python) 以下演示用户行为日志的存储与查询(使用 `pymongo`): ```python from pymongo import MongoClient from datetime import datetime # 连接 MongoDB(默认端口 27017) client = MongoClient("mongodb://localhost:27017/") db = client["user_analytics"] # 数据库名 logs_collection = db["user_logs"] # 集合名 # 插入一条动态结构的日志(无需预定义字段) log_data = { "user_id": "u123", "event": "click_button", "timestamp": datetime.now(), "metadata": { # 嵌套文档 "button_color": "blue", "page_url": "/home" }, # 可自由添加新字段 "device": "mobile" } logs_collection.insert_one(log_data) # 查询:今天发生的 "click_button" 事件 today = datetime.today().replace(hour=0, minute=0, second=0) result = logs_collection.find({ "event": "click_button", "timestamp": {"$gte": today} }) # 输出结果 for doc in result: print(doc) # 创建索引(加速查询) logs_collection.create_index([("timestamp", 1)]) # 1 表示升序 ``` #### 代码解释: 1. **灵活插入数据** - 字段可动态扩展(如 `device` 是后续新增字段)。 2. **嵌套文档** - `metadata` 字段存储复杂 JSON 结构。 3. **索引优化** - 对 `timestamp` 创建索引加速时间范围查询。 4. **查询语法** - `$gte` 表示大于等于,用于筛选今天及之后的日志。 --- ### 何时选择 MongoDB? | **场景** | **推荐度** | **原因** | |-------------------------|------------|------------------------------| | 实时分析/大数据 | ⭐⭐⭐⭐⭐ | 水平扩展 + 高吞吐写入 | | 内容管理系统(CMS) | ⭐⭐⭐⭐ | 动态内容结构 | | 物联网(IoT)传感器数据 | ⭐⭐⭐⭐⭐ | 处理海量异构数据 | | 用户行为追踪 | ⭐⭐⭐⭐ | 灵活存储事件属性 | | 地理围栏服务 | ⭐⭐⭐⭐⭐ | 原生地理空间查询支持 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值