MongoDB 与传统关系型数据库mysql比较

与关系型数据库相比,MongoDB的优点: 转载自  http://blog.sina.com.cn/s/blog_966e430001019s8v.html
①弱一致性(最终一致),更能保证用户的访问速度:
举例来说,在传统的关系型数据库中,一个COUNT类型的操作会锁定数据集,这样可以保证得到“当前”情况下的精确值。这在某些情况下,例
如通过ATM查看账户信息的时候很重要,但对于Wordnik来说,数据是不断更新和增长的,这种“精确”的保证几乎没有任何意义,反而会产生很大的延
迟。他们需要的是一个“大约”的数字以及更快的处理速度。

但某些情况下MongoDB会锁住数据库。如果此时正有数百个请求,则它们会堆积起来,造成许多问题。我们使用了下面的优化方式来避免锁定:

每次更新前,我们会先查询记录。查询操作会将对象放入内存,于是更新则会尽可能的迅速。在主/从部署方案中,从节点可以使用“-pretouch”参数运行,这也可以得到相同的效果。

使用多个mongod进程。我们根据访问模式将数据库拆分成多个进程。 
②文档结构的存储方式,能够更便捷的获取数据。
对于一个层级式的数据结构来说,如果要将这样的数据使用扁平式的,表状的结构来保存数据,这无论是在查询还是获取数据时都十分困难。

举例1:
就拿一个“字典项”来说,虽然并不十分复杂,但还是会关系到“定义”、“词性”、“发音”或是“引用”等内容。大部分工程师会将这种模型使用关系型数据库
中的主键和外键表现出来,但把它看作一个“文档”而不是“一系列有关系的表”岂不更好?使用
“dictionary.definition.partOfSpeech=‘noun‘”来查询也比表之间一系列复杂(往往代价也很高)的连接查询方便
且快速。

举例2:在一个关系型数据库中,一篇博客(包含文章内容、评论、评论的投票)会被打散在多张数据表中。在MongoDB中,能用一个文档来表示一篇博客,
评论与投票作为文档数组,放在正文主文档中。这样数据更易于管理,消除了传统关系型数据库中影响性能和水平扩展性的“JOIN”操作。

CODE↓

> db.blogposts.save({ title : "My First Post", author: {name : "Jane", id :1},
  comments : [{ by: "Abe", text: "First" },
              { by : "Ada", text : "Good post" }]
})

> db.blogposts.find( { "author.name" : "Jane" } )

> db.blogposts.findOne({ title : "My First Post", "author.name": "Jane",
  comments : [{ by: "Abe", text: "First" },
              { by : "Ada", text : "Good post" } ]
})
> db.blogposts.find( { "comments.by" : "Ada" } )

> db.blogposts.ensureIndex( { "comments.by" : 1 } );

举例③:
MongoDB是一个面向文档的数据库,目前由10gen开发并维护,它的功能丰富,齐全,完全可以替代MySQL。在使用MongoDB做产品原型的过程中,我们总结了MonogDB的一些亮点:

使用JSON风格语法,易于掌握和理解:MongoDB使用JSON的变种BSON作为内部存储的格式和语法。针对MongoDB的操作都使用JSON风格语法,客户端提交或接收的数据都使用JSON形式来展现。相对于SQL来说,更加直观,容易理解和掌握。

Schema-less,支持嵌入子文档:MongoDB是一个Schema-free的文档数据库。一个数据库可以有多个Collection,每
个Collection是Documents的集合。Collection和Document和传统数据库的Table和Row并不对等。无需事先定义
Collection,随时可以创建。
Collection中可以包含具有不同schema的文档记录。 这意味着,你上一条记录中的文档有3个属性,而下一条记录的文档可以有10个属
性,属性的类型既可以是基本的数据类型(如数字、字符串、日期等),也可以是数组或者散列,甚至还可以是一个子文档(embed document)。这
样,可以实现逆规范化(denormalizing)的数据模型,提高查询的速度。

③内置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运营都是个值得注意的地方。

时间: 2024-10-29 10:47:04

MongoDB 与传统关系型数据库mysql比较的相关文章

(转)Mongodb相对于关系型数据库的优缺点

与关系型数据库相比,MongoDB的优点:①弱一致性(最终一致),更能保证用户的访问速度:举例来说,在传统的关系型数据库中,一个COUNT类型的操作会锁定数据集,这样可以保证得到“当前”情况下的精确值.这在某些情况下,例如通过ATM查看账户信息的时候很重要,但对于Wordnik来说,数据是不断更新和增长的,这种“精确”的保证几乎没有任何意义,反而会产生很大的延迟.他们需要的是一个“大约”的数字以及更快的处理速度. 但某些情况下MongoDB会锁住数据库.如果此时正有数百个请求,则它们会堆积起来,

详细总结 Hive VS 传统关系型数据库

本文思路,看图说话,一张图,清晰总结二者区别 下面对图中的各条做详细总结 1.查询语言 不做赘述 2.数据存储位置 不做赘述 3.数据格式 Hive:Hive 中没有定义专门的数据格式,数据格式可以由用户指定,用户定义数据格式需要指定三个属性:列分隔符(通常为空格."\t"."\x001″).行分隔符("\n")以及读取文件数据的方法(Hive 中默认有三个文件格式 TextFile,SequenceFile 以及 RCFile). 由于在加载数据的过程中

BI-学习之 商业智能平台的引入(传统关系型数据库的问题)

早在 SQL Server 2005里面就有了这种 完整的商业智能平台了,那时候Nosql什么的都还停留在概念性的提出阶段,发展至2009年才一下子蹦了出来变得众所周知了.当然这个要扯就扯远了,咱们还是直接来介绍一下这篇文章的重点传统关系型数据库在当时面临的一些问题. 关系型数据库的局限 SQL Server 2005 –完整的商业智能平台 关系型数据库的局限: 随着信息技术的飞速发展,数据处理不仅在数量上要求越来越大,而且在质量上也要求越来越高,数据库所管理的数据已经发生了根本的变化.这一变化

安装关系型数据库MySQL 安装大数据处理框架Hadoop

安装关系型数据库MySQL 安装大数据处理框架Hadoop 简述Hadoop平台的起源.发展历史与应用现状. 列举发展过程中重要的事件.主要版本.主要厂商: 国内外Hadoop应用的典型案例. (1)Hadoop的介绍: Hadoop最早起源于Nutch,Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取.索引.查询等功能.但随着抓取网页数量的增加,遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索引问题.2003年.2004年谷歌发表的两篇论文为该问题提供了可行的解决方案,即

Python3爬虫(九) 数据存储之关系型数据库MySQL

Infi-chu: http://www.cnblogs.com/Infi-chu/ 关系型数据库关系型数据库是基于关系模型的数据库,而关系模型是通过二维表来保存的,所以关系型数据库的存储方式就是行列组成的表.每一列是一个字段,每一行是一条记录.表可以看成是摸个实体的集合,而实体之间存在关系,比如主键和外键常见的关系型数据库有:Oracle.MySQL.SQLite.SQL Server.DB2等 MySQL在Python2中,MySQL的链接库是MySQLdb, 而在Python3中,官方不支

关系型数据库MySql简介

什么是关系型数据库? 数据库就是用来存储数据的仓库,是一种特殊的文件. 根据存储的数据不同,划分为关系型数据库和非关系型数据库. 关系型数据库就是指 建立在关系模型基础上的数据库,通俗来讲这种数据库就是由多张表组成,并且这些表之间存在一定的关系. 关系型数据库的核心元素: 记录: 数据行 字段 :  数据列 数据表 : 数据行的集合 数据库 : 数据表的集合 主键 : 特殊的字段, 用来唯一标识记录的唯一性. 了解关系数据库,就需要了解到 RDBMS , 即关系型数据库管理系统. 所谓的关系型数

Flink RichSourceFunction应用,读关系型数据(mysql)数据写入关系型数据库(mysql)

1. 写在前面 Flink被誉为第四代大数据计算引擎组件,即可以用作基于离线分布式计算,也可以应用于实时计算.Flink的核心是转化为流进行计算.Flink三个核心:Source,Transformation,Sink.其中Source即为Flink计算的数据源,Transformation即为进行分布式流式计算的算子,也是计算的核心,Sink即为计算后的数据输出端.Flink Source原生支持包括Kafka,ES,RabbitMQ等一些通用的消息队列组件或基于文本的高性能非关系型数据库.而

NoSQL数据库技术实战-第1章 NoSQL的数据一致性 传统关系型数据库的ACID

在看着章节的时候,我简单的回顾了一下关系型数据库的事务处理的ACID原则,其中原子性和持久性比较好理解.由于以前没有深入去研究.关于一致性和隔离性上我产生了疑问,在整理后分析如下: 一致性:书中所说的一致性是指数据库要保证事务处理前后,数据从一种一致的状态转移到另外一种一致的状态.书中举的例子是银行转账前后总账是不应该变化的.但是我困惑的是,转账前后总账的一致性应该是在应用程序中控制的,数据库怎么能保证呢?最后我的理解是,数据库本身不保证你的数据的一致性,但是它有一些处理,只要你的应用程序写法没

关系型数据库——MySQL

[MySQL架构图] MySQL简要架构图如下图所示,引擎层以插件方式集成了不同的存储引擎,它们共用Server层对外提供服务.   连接器:用于连接管理,进行身份认证及权限相关的管理.(登录MySQL) 查询缓存区:执行查询语句时,先从缓存区查询.(该功能V8.0之后移除) 分析器:未命中缓存时,对SQL进行词法分析.语法分析. 优化器:按照MySQL认为的最优方案,生成执行计划. 执行器:执行SQL,并从存储引擎返回数据. 存储引擎:存储数据,提供读写接口 [MySQL存储引擎] V5.5之