Linux/Nginx/Apache/PHP/MySQL/C/JAVA/Python/Perl/关系型数据库/Memcached/Redis/MongoDB/Tokyo Tyrant/NoSQL/Sphinx/Solr/Lucene/ElasticSearch/搜索引擎/面向对象/设计模式/数据结构/算法/架构/分布式/高性能/高可用/高并发/高可扩展性/文件系统/开源/大数据/数据挖掘

MySQL与MongoDB的区别

一.MongoDB简介

什么是MongoDB ?
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

 

主要特点
MongoDB的提供了一个面向文档存储,操作起来比较简单和容易。
你可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。
你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
MongoDB安装简单。

历史 2007年10月,MongoDB由10gen团队所发展。2009年2月首度推出。
2012年05月23日,MongoDB2.1 开发分支发布了! 该版本采用全新架构,包含诸多增强。
2012年06月06日,MongoDB 2.0.6 发布,分布式文档数据库。
2013年04月23日,MongoDB 2.4.3 发布,此版本包括了一些性能优化,功能增强以及bug修复。
2013年08月20日,MongoDB 2.4.6 发布,是目前最新的稳定版。

MongoDB 下载
你可以在mongodb官网下载该安装包,地址为: http://www.mongodb.org/downloads。MonggoDB支持以下平台:
OS X 32-bit
OS X 64-bit
Linux 32-bit
Linux 64-bit
Windows 32-bit
Windows 64-bit
Solaris i86pc
Solaris 64

MongoDB 工具
有几种可用于MongoDB的管理工具。

监控
MongoDB提供了网络和系统监控工具Munin,它作为一个插件应用于MongoDB中。
Gangila是MongoDB高性能的系统监视的工具,它作为一个插件应用于MongoDB中。
基于图形界面的开源工具 Cacti, 用于查看CPU负载, 网络带宽利用率,它也提供了一个应用于监控 MongoDB 的插件。

GUI
Fang of Mongo – 网页式,由Django和jQuery所构成。
Futon4Mongo – 一个CouchDB Futon web的mongodb山寨版。
Mongo3 – Ruby写成。
MongoHub – 适用于OSX的应用程序。
Opricot – 一个基于浏览器的MongoDB控制台, 由PHP撰写而成。
Database Master — Windows的mongodb管理工具
RockMongo — 最好的PHP语言的MongoDB管理工具,轻量级, 支持多国语言.

MongoDB 应用案例
下面列举一些公司MongoDB的实际应用:
Craiglist上使用MongoDB的存档数十亿条记录。
FourSquare,基于位置的社交网站,在Amazon EC2的服务器上使用MongoDB分享数据。
Shutterfly,以互联网为基础的社会和个人出版服务,使用MongoDB的各种持久性数据存储的要求。
bit.ly, 一个基于Web的网址缩短服务,使用MongoDB的存储自己的数据。
spike.com,一个MTV网络的联营公司, spike.com使用MongoDB的。
Intuit公司,一个为小企业和个人的软件和服务提供商,为小型企业使用MongoDB的跟踪用户的数据。
sourceforge.net,资源网站查找,创建和发布开源软件免费,使用MongoDB的后端存储。
etsy.com ,一个购买和出售手工制作物品网站,使用MongoDB。
纽约时报,领先的在线新闻门户网站之一,使用MongoDB。
CERN,著名的粒子物理研究所,欧洲核子研究中心大型强子对撞机的数据使用MongoDB。

http://www.runoob.com/mongodb/mongodb-intro.html

 

二.MongoDB和MySQL比较

MongoDB本身它还算比较年轻的一个产品,所以它的问题,就是成熟度肯定没有传统MySQL那么成熟稳定。所以在使用的时候,
第一,尽量使用稳定版,不要在线上使用开发版,这是一个大原则;
另外一点,备份很重要,MongoDB如果出现一些异常情况,备份一定是要能跟上。除了通过传统的复制的方式来做备份,离线备份也还是要有,不管你是用什么方式,都要有一个完整的离线备份。往往最后出现了特殊情况,它能帮助到你;
另外,MongoDB性能的一个关键点就是索引,索引是不是能有比较好的使用效率,索引是不是能够放在内存中,这样能够提升随机读写的性能。如果你的索引不能完全放在内存中,一旦出现随机读写比较高的时候,它就会频繁地进行磁盘交换,这个时候,MongoDB的性能就会急剧下降,会出现波动。
另外,MongoDB还有一个最大的缺点,就是它占用的空间很大,因为它属于典型空间换时间原则的类型。那么它的磁盘空间比普通数据库会浪费一些,而且到目前为止它还没有实现在线压缩功能,在MongoDB中频繁的进行数据增删改时,如果记录变了,例如数据大小发生了变化,这时候容易产生一些数据碎片,出现碎片引发的结果,一个是索引会出现性能问题,
另外一个就是在一定的时间后,所占空间会莫明其妙地增大,所以要定期把数据库做修复,定期重新做索引,这样会提升MongoDB的稳定性和效率。在最新的版本里,它已经在实现在线压缩,估计应该在2.0版左右,应该能够实现在线压缩,可以在后台执行现在repair DataBase的一些操作。如果那样,就解决了目前困扰我们的大问题。

http://blog.itpub.net/642366/viewspace-1067038/


三.问题
用户数据库是用mongodb好,还是用mysql好?修改
打算给一系列产品统一账户,程序用的是nodejs写的,用户数据库大概就是记录用户名、密码、电子邮箱还有一些会高并发频繁变更的信息,这种数据库要用mongodb还是mysql?或者有更好的推荐吗?

答案:
a1: mysql更通用 如果不知道选什么就选mysql错不了. 而mongodb的存在更多的是对于mysql的一个细分需求领域中的补充.
比如在游戏行业中 使用json格式的mongodb基本上可以满足所有数据结构的存储, 而且你再也不必因为扩充一个小功能而纠结新建一个表来存储 还是新建一个字段并用字符串来存储(每次读/写都要解析/序列化成字符串存储), mysql是不是特别傻笨粗, 而游戏基本上前面搭好框子后面写业务的时候 一直都是在做这些东西.

但正如我上面说的 mongodb只是一个细分需求领域的补充, 很多东西他做不了也做不好 假如你的程序哪怕有1%的功能在这里 这都容易悲剧.

另外说一下题主问题中提供的需求看法.
看上去是统一认证系统或者认证平台之类的需求.
一般有以下特点.
1. 数据结构简单. 所以用mysql还是mongodb在这里都一样.
2. 可能对读性能有要求 但写速度关系不大, 一般都是大量已注册用户登录. 因此mysql一定要配合redis或者memcache, 这样的话 mongodb稍微胜出一点, mongodb本身的读速度有优化, 很可观.
3. 数据结构中含有一些特殊数据 比如玩家的充值信息. mysql明显比mongodb好的太多.
4. 日志统计, mysql的存储过程可以很方便的做很多统计工作, mongodb的话就要委屈后台小哥多写点代码来做统计了(实际上因为数据简单 可能也就几行代码).

因此呢 根据上面几点来说, 用mongodb的意义不大, 但具体题主的需求, 自己根据上面我列举的几条可以自己再度量一下.

 

a2: 推荐mysql

更主要还是看你怎么用,你要很清闲,想学习,爱折腾那就mongodb吧。

存储用户数据,肯定也要读取吧,还要JOIN关联,各种查询,分析。

用mongdb可就麻烦了,group受限,map/reduce不爽

现在的mysql也不知有没有对mongodb对接的支持。

mysql也就是几条SQL的事,用mongodb不同库,还得在代码里拼数据。

尝鲜一时爽,却埋下了以后更多的工作量。

我个人只是用mongodb作相对独立的小系统,比如一些数据分析,抓取,汇总的工作。

https://www.zhihu.com/question/26095333


四.1.1 MongoDB的简单介绍
在当今的数据库市场上,MySQL无疑是占有一席之地的。作为一个开源的关系型数据库,MySQL被大量应用在各大网站后台中,承担着信息存储的重要作用。2009年,甲骨文公司(Oracle)收购Sun公司,MySQL成为Oracle旗下产品。

而MongoDB是一种文件导向的数据库管理系统,属于一种通称为NoSQL的数据库,是10gen公司旗下的开源产品,其内部数据存储的方式与传统的关系型数据有很大差别。

NoSQL的全称是Not Only SQL,也可以理解非关系型的数据库,是一种新型的革命式的数据库设计方式,不过它不是为了取代传统的关系型数据库而被设计的,它们分别代表了不同的数据库设计思路。

虽然MongoDB背后的公司没有Oracle强大,但其目前也正在被应用在各行各业中。MongoDB是目前被应用最广泛的NoSQL数据库产品。

1.2 MongoDB的存储特点
在传统的关系型数据库中,数据是以表单为媒介进行存储的,每个表单均拥有纵向的列和横向的行。


由此可见,相比较MySQL,MongoDB以一种直观文档的方式来完成数据的存储。它很像JavaScript中定义的JSON格式,不过数据在存储的时候MongoDB数据库为文档增加了序列化的操作,最终存进磁盘的其实是一种叫做BSON的格式,即Binary-JSON。


1.3 MongoDB的应用场景
在另一方面,对开发者来说,如果是因为业务需求或者是项目初始阶段,而导致数据的具体格式无法明确定义的话,MongoDB的这一鲜明特性就脱颖而出了。相比传统的关系型数据库,它非常容易被扩展,这也为写代码带来了极大的方便。

不过MongoDB对数据之间事务关系支持比较弱,如果业务这一方面要求比较高的话,MongoDB还是并不适合此类型的应用。

 

另外,MongoDB出现的时机比较晚,还具备一些非常鲜明的特性。比如:

1. 它里面自带了一个名叫GirdFS的分布式文件系统,这就为MongoDB的部署提供了很大便利。而像MySQL这种比较早的数据库,虽然市面上有很多不同的分表部署的方案,但这种终究不如MongoDB直接官方支持来得便捷实在。

2. 另外,MongoDB内部还自建了对map-reduce运算框架的支持,虽然这种支持从功能上看还算是比较简单的,相当于MySQL里GroupBy功能的扩展版,不过也为数据的统计带来了方便。

3. MongoDB在启动后会将数据库中的数据以文件映射的方式加载到内存中。如果内存资源相当丰富的话,这将极大地提高数据库的查询速度,毕竟内存的I/O效率比磁盘高多了。

 

但是,作为一个新鲜的事务,MongoDB也存在着很多不足。它在为开发人员提供了便利的情况下,却在运维上面临着不少难题,比如:

1. 比起MySQL,MongoDB没有成熟的运维经验,需要不断地探索。

2. MongoDB中的数据存放具有相当的随意性,不具有MySQL在开始就定义好了。对运维人员来说,他们可能不清楚数据库内部数据的数据格式,这也会数据库的运维带来了麻烦。

2. 测试目的
MongoDB与MySQL作为两种不同类型的数据库,当其中存放的记录越来越多的时候,其插入效率将会受到怎样的影响,是本次实验所关注的对象。

在这里,我们将本次实验数据库中数据存储的规模定在1亿条。


总结:

1. 整体上的插入速度还是和上一回的统计数据类似:MongoDB不指定_id插入 > MySQL不指定主键插入 > MySQL指定主键插入 > MongoDB指定_id插入。

2. 从图中可以看出,在指定主键插入数据的时候,MySQL与MongoDB在不同数据数量级时,每秒插入的数据每隔一段时间就会有一个波动,在图表中显示成为规律的毛刺现象。而在不指定插入数据时,在大多数情况下插入速率都比较平均,但随着数据库中数据的增多,插入的效率在某一时段有瞬间下降,随即又会变稳定。

3. 整体上来看,MongoDB的速率波动比MySQL的严重,方差变化较大。

4. MongoDB在指定_id插入时,当插入的数据变多之后,插入效率有明显地下降。在其他三种的插入测试中,从开始到结束,其插入的速率在大多数的时候都固定在一个标准上。

 

分析:

1. 毛刺现象是因为,当插入的数据太多的时候,MongoDB需要将内存中的数据写进硬盘,MySQL需要重新分表。这些操作每当数据库中的数据达到一定量级后就会自动进行,因此每隔一段时间就会有一个明显的毛刺。

2. MongoDB毕竟还是新生事物,其稳定性没有已应用多年的MySQL优秀。

3. MongoDB在指定_id插入的时候,其性能的下降还是很厉害的。


8.1 测试结论
1. 相比较MySQL,MongoDB数据库更适合那些读作业较重的任务模型。MongoDB能充分利用机器的内存资源。如果机器的内存资源丰富的话,MongoDB的查询效率会快很多。

2. 在带”_id”插入数据的时候,MongoDB的插入效率其实并不高。如果想充分利用MongoDB性能的话,推荐采取不带”_id”的插入方式,然后对相关字段作索引来查询。

8.2 测试需要进一步注意的问题
对MongoDB的读取测试考虑不周,虽然这只是一个额外的测试。在这个测试中,随机生成大量待测试的数据很有必要,但生成大量互不相同的数据就没有必要了。正是这一点,把我的读取测试规模限定在了50w条,没能进一步进行分析。

8.3 MongoDB的优势
1. MongoDB适合那些对数据库具体数据格式不明确或者数据库数据格式经常变化的需求模型,而且对开发者十分友好。

2. MongoDB官方就自带一个分布式文件系统,可以很方便地部署到服务器机群上。MongoDB里有一个Shard的概念,就是方便为了服务器分片使用的。每增加一台Shard,MongoDB的插入性能也会以接近倍数的方式增长,磁盘容量也很可以很方便地扩充。

3. MongoDB还自带了对map-reduce运算框架的支持,这也很方便进行数据的统计。

 

其他方面的优势还在发掘中,本人也是刚刚接触这个不久。

8.4 MongoDB的缺陷
1. 事务关系支持薄弱。这也是所有NoSQL数据库共同的缺陷,不过NoSQL并不是为了事务关系而设计的,具体应用还是很需求。

2. 稳定性有些欠缺,这点从上面的测试便可以看出。

3. MongoDB一方面在方便开发者的同时,另一方面对运维人员却提出了相当多的要求。业界并没有成熟的MongoDB运维经验,MongoDB中数据的存放格式也很随意,等等问题都对运维人员的考验。

http://blog.csdn.net/clh604/article/details/19608869


五、MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库。它们各有各的优点,关键是看用在什么地方。所以我们所熟知的那些SQL(全称Structured Query Language)语句就不适用于MongoDB了,因为SQL语句是关系型数据库的标准语言。

以我们公司项目为例,在早期的项目中,都在使用关系型数据库,用过SQLServer,Oracle,DB2,后来全部转向Mysql,原因很简单:Mysql在性能不错的情况下,有着开源优势。Mysql的事务性与高性能是我们主要考虑的。后来,由于项目要用到用户系统,即会有大量的用户数据进行交互--海量存储,Mysql的读写速度会有一点瓶颈,于是我们就想到了最近发展很强势的Nosql。在Nosql早期的memcache的发展下,又出现了很多非关系型数据库,比如redis,mongodb。经过一段时间的测试,redis与mongodb的读写速度确实比Mysql有着很明显的优势。mongodb的写入速度大约2.5W/次每秒。

mongodb以BSON结构(二进制)进行存储,对海量数据存储有着很明显的优势。下面是Mongodb与Mysql的操作命令的对比。

http://blog.csdn.net/suxinpingtao51/article/details/40981621


六、对比MySQL,你究竟在什么时候更需要MongoDB
摘要:对比传统关系型数据库,NoSQL有着非常显著的性能和扩展性优势,然而这些优点却建立在一些关键功能的丢失之上,比如事务、join等。那么在数据体积激增的当下,究竟哪个数据库才会适合你的场景,下面看Moshe的分享。

【编者按】随着数据的爆发性增长,NoSQL得到的关注已越来越多,然而你的用例真正需要使用NoSQL数据库吗?又真的适合使用NoSQL吗?近日,Bright Aqua研发副总裁Moshe Kaplan以BillRun系统为例,分析了MongoDB的优势和使用场景:

以下为译文:
NoSQL已经流行了很长一段时间,那么究竟是什么场景下你才更需要用到这些“新兴事物”,就比如MongoDB?下面是一些总结:

你期望一个更高的写负载

默认情况下,对比事务安全,MongoDB更关注高的插入速度。如果你需要加载大量低价值的业务数据,那么MongoDB将很适合你的用例。但是必须避免在要求高事务安全的情景下使用MongoDB,比如一个1000万美元的交易。

不可靠环境保证高可用性

设置副本集(主-从服务器设置)不仅方便而且很快,此外,使用MongoDB还可以快速、安全及自动化的实现节点(或数据中心)故障转移。

未来会有一个很大的规模

数据库扩展是非常有挑战性的,当单表格大小达到5-10GB时,MySQL表格性能会毫无疑问的降低。如果你需要分片并且分割你的数据库,MongoDB将很容易实现这一点。

使用基于位置的数据查询

MongoDB支持二维空间索引,因此可以快速及精确的从指定位置获取数据。

非结构化数据的爆发增长

给RDBMS增加列在有些情况下可能锁定整个数据库,或者增加负载从而导致性能下降,这个问题通常发生在表格大于1GB(更是下文提到BillRun系统中的痛点——单表格动辄几GB)的情况下。鉴于MongoDB的弱数据结构模式,添加1个新字段不会对旧表格有任何影响,整个过程会非常快速;因此,在应用程序发生改变时,你不需要专门的1个DBA去修改数据库模式。

缺少专业的数据库管理员

如果你没有专业的DBA,同时你也不需要结构化你的数据及做join查询,MongoDB将会是你的首选。MongoDB非常适合类的持久化,类可以被序列化成JSON并储存在MongoDB。需要注意的是,如果期望获得一个更大的规模,你必须要了解一些最佳实践来避免走入误区。

http://www.csdn.net/article/2014-03-06/2818652-when-use-mongodb-rather-mysql


七、论MongoDB和MySQL的区别

1.MySQL来自女儿的名字;MongoDB来自humongous
2.MySQL使用Table/Row/Column;MongoDB使用Collection/Document
3.MySQL需要指定table的schema;MongoDB的collection的每个document的schema可以自由修改
4.MySQL支持join;MongoDB没有join
5.MySQL使用SQL语言;MongoDB使用类似JavaScript的函数

提示:下面的文章链接里面有相关MongoDB和MySQL的区别的视频。

http://mp.weixin.qq.com/s?src=3&timestamp=1463216453&ver=1&signature=HodMxNvYoVUMewovM03HuiiSSUTObnyYX0HOfqSE2eT9vczsOBJ*wvSocx0dqLidKMsT9uU7UAclhzUTlyss0-2zyCmKQmsZZgim29PzaLBW2gNDZa4uayYJSAL8xR6CTLRPYIyeJlIr2xvEXUcQyA==


八、mongodb与mysql命令对比
mongodb与mysql命令对比 传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。

http://wenku.baidu.com/view/b7684e650b1c59eef8c7b449.html


九、在PHP项目中使用MySql与MongoDb的一些对比
MongoDb的特点与优势很难用语言描述清楚,以下参考开源中国老大'红薯'的一篇文章较清晰比较了一下MySql与MongoDB存储区别
MySQL是关系型数据库中的明星,MongoDB是文档型数据库中的翘楚。下面通过一个设计实例对比一下二者:假设我们正在维护一个手机产品库,里面除了包含手机的名称,品牌等基本信息,还包含了待机时间,外观设计等参数信息,应该如何存取数据呢?

如果使用MySQL的话,应该如何存取数据呢?

如果使用MySQL话,手机的基本信息单独是一个表,另外由于不同手机的参数信息差异很大,所以还需要一个参数表来单独保存。

01 CREATE TABLE IF NOT EXISTS `mobiles` (
02 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
03 `name` VARCHAR(100) NOT NULL,
04 `brand` VARCHAR(100) NOT NULL,
05 PRIMARY KEY (`id`)
06 );
07
08 CREATE TABLE IF NOT EXISTS `mobile_params` (
09 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
10 `mobile_id` int(10) unsigned NOT NULL,
11 `name` varchar(100) NOT NULL,
12 `value` varchar(100) NOT NULL,
13 PRIMARY KEY (`id`)
14 );
15
16 INSERT INTO `mobiles` (`id`, `name`, `brand`) VALUES
17 (1, 'ME525', '摩托罗拉'),
18 (2, 'E7' , '诺基亚');
19
20 INSERT INTO `mobile_params` (`id`, `mobile_id`, `name`, `value`) VALUES
21 (1, 1, '待机时间', '200'),
22 (2, 1, '外观设计', '直板'),
23 (3, 2, '待机时间', '500'),
24 (4, 2, '外观设计', '滑盖');
注:为了演示方便,没有严格遵守关系型数据库的范式设计。

如果想查询待机时间大于100小时,并且外观设计是直板的手机,需按照如下方式查询:

1 SELECT * FROM `mobile_params` WHERE name = '待机时间' AND value > 100;
2 SELECT * FROM `mobile_params` WHERE name = '外观设计' AND value = '直板';
注:参数表为了方便,把数值和字符串统一保存成字符串,实际使用时,MySQL允许在字符串类型的字段上进行数值类型的查询,只是需要进行类型转换,多少会影响一点性能。

两条SQL的结果取交集得到想要的MOBILE_IDS,再到mobiles表查询即可:

SELECT * FROM `mobiles` WHERE mobile_id IN (MOBILE_IDS)
如果使用MongoDB的话,应该如何存取数据呢?

如果使用MongoDB的话,虽然理论上可以采用和MySQL一样的设计方案,但那样的话就显得无趣了,没有发挥出MongoDB作为文档型数据库的优点,实际上使用MongoDB的话,和MySQL相比,形象一点来说,可以合二为一:

01 db.getCollection("mobiles").ensureIndex({
02 "params.name": 1,
03 "params.value": 1
04 });
05
06 db.getCollection("mobiles").insert({
07 "_id": 1,
08 "name": "ME525",
09 "brand": "摩托罗拉",
10 "params": [
11 {"name": "待机时间", "value": 200},
12 {"name": "外观设计", "value": "直板"}
13 ]
14 });
15
16 db.getCollection("mobiles").insert({
17 "_id": 2,
18 "name": "E7",
19 "brand": "诺基亚",
20 "params": [
21 {"name": "待机时间", "value": 500},
22 {"name": "外观设计", "value": "滑盖"}
23 ]
24 });
如果想查询待机时间大于100小时,并且外观设计是直板的手机,需按照如下方式查询:

view sourceprint?
1 db.getCollection("mobiles").find({
2 "params": {
3 $all: [
4 {$elemMatch: {"name": "待机时间", "value": {$gt: 100}}},
5 {$elemMatch: {"name": "外观设计", "value": "直板"}}
6 ]
7 }
8 });
注:查询中用到的$all,$elemMatch等高级用法的详细介绍请参考官方文档中相关说明。

MySQL需要多个表,多次查询才能搞定的问题,MongoDB只需要一个表,一次查询就能搞定,对比完成,相对MySQL而言,MongoDB显得更胜一筹,至少本例如此。


以上为引文,看完这篇文章大概可以了解nosql的一下特性,在创建表的时候,可以先不用想好表的字段是什么,在一些不是很严谨的详情页可以使用在查询速度上可以上一个台阶,在有索引的字段查询上也与MySql不相上下
http://mp.weixin.qq.com/s?src=3&timestamp=1463216453&ver=1&signature=jp5td-ycKfri2rb1m028aW*6H5KYa*L6KS5hxJAUSVcjuG-2Kei3LDrLixZfJ*FNVonAWMy-EGx1QRkFWU3WWhBrnAmOGEEsq9IZUq3CwJ3JR*fX0dU9OJ-76SFiGct6r-3SYzkehLDtPvXQBesVmQ==


十、28 个 MongoDB NoSQL 数据库的面试问答

MongoDB是目前最好的面向文档的免费开源NoSQL数据库。如果你正准备参加MongoDB NoSQL数据库的技术面试,你最好看看下面的MongoDB NoSQL面试问答。这些MongoDB NoSQL面试问答涵盖了NoSQL数据库基本的概念,复制(Replication),分片(Sharding),事务和锁,跟踪分析工具(Profiler),Nuances和日志等特性。让我们看看下面的这些MongoDB NoSQL数据库的面试问答吧:

1. 你说的NoSQL数据库是什么意思?NoSQL与RDBMS直接有什么区别?为什么要使用和不使用NoSQL数据库?说一说NoSQL数据库的几个优点?
我写了一篇完整的博客来回答这些问题,看这里(http://theprofessionalspoint.blogspot.in/2014/01/nosql-vs-rdbms-why-and-why-not-to-use.html)

2. NoSQL数据库有哪些类型?
NoSQL数据库的类型(http://theprofessionalspoint.blogspot.in/2014/01/types-and-examples-of-nosql-databases.html)

例如:MongoDB, Cassandra, CouchDB, Hypertable, Redis, Riak, Neo4j, HBASE, Couchbase, MemcacheDB, RevenDB and Voldemort are the examples of NoSQL databases.

详细阅读(http://theprofessionalspoint.blogspot.in/2014/01/12-best-free-and-open-source-nosql.html)。

3. MySQL与MongoDB之间最基本的差别是什么?
MySQL和MongoDB两者都是免费开源的数据库。MySQL和MongoDB有许多基本差别包括数据的表示(data representation),查询,关系,事务,schema的设计和定义,标准化(normalization),速度和性能。通过比较MySQL和MongoDB,实际上我们是在比较关系型和非关系型数据库。

 

http://www.baidu.com/s?wd=数据库%20schema
http://www.educity.cn/shujuku/625700.html

 

详细阅读(http://theprofessionalspoint.blogspot.in/2013/12/mysql-vs-mongodb-basic-differences.html)

4. 你怎么比较MongoDB、CouchDB及CouchBase?
MongoDB和CouchDB都是面向文档的数据库。MongoDB和CouchDB都是开源NoSQL数据库的最典型代表。 除了都以文档形式存储外它们没有其他的共同点。MongoDB和CouchDB在数据模型实现、接口、对象存储以及复制方法等方面有很多不同。

细节可以参见下面的链接:

MongDB vs CouchDB(http://theprofessionalspoint.blogspot.in/2013/12/mongodb-vs-couchdb-open-source-nosql.html)
CouchDB vs CouchBase(http://theprofessionalspoint.blogspot.in/2014/01/couchdb-vs-couchbase-differences-and.html)

5. MongoDB成为最好NoSQL数据库的原因是什么?
以下特点使得MongoDB成为最好的NoSQL数据库:

面向文件的

高性能

高可用性

易扩展性

丰富的查询语言

6.32位系统上有什么细微差别?
journaling会激活额外的内存映射文件。这将进一步抑制32位版本上的数据库大小。因此,现在journaling在32位系统上默认是禁用的。

7. journal回放在条目(entry)不完整时(比如恰巧有一个中途故障了)会遇到问题吗?
每个journal (group)的写操作都是一致的,除非它是完整的否则在恢复过程中它不会回放。

8. 分析器在MongoDB中的作用是什么?
MongoDB中包括了一个可以显示数据库中每个操作性能特点的数据库分析器。通过这个分析器你可以找到比预期慢的查询(或写操作);利用这一信息,比如,可以确定是否需要添加索引。

9. 名字空间(namespace)是什么?
MongoDB存储BSON对象在丛集(collection)中。数据库名字和丛集名字以句点连结起来叫做名字空间(namespace)。

10. 如果用户移除对象的属性,该属性是否从存储层中删除?
是的,用户移除属性然后对象会重新保存(re-save())。

11. 能否使用日志特征进行安全备份?
是的。

12. 允许空值null吗?
对于对象成员而言,是的。然而用户不能够添加空值(null)到数据库丛集(collection)因为空值不是对象。然而用户能够添加空对象{}。

13. 更新操作立刻fsync到磁盘?
不会,磁盘写操作默认是延迟执行的。写操作可能在两三秒(默认在60秒内)后到达磁盘。例如,如果一秒内数据库收到一千个对一个对象递增的操作,仅刷新磁盘一次。(注意,尽管fsync选项在命令行和经过getLastError_old是有效的)(译者:也许是坑人的面试题??)。

14. 如何执行事务/加锁?
MongoDB没有使用传统的锁或者复杂的带回滚的事务,因为它设计的宗旨是轻量,快速以及可预计的高性能。可以把它类比成MySQL MylSAM的自动提交模式。通过精简对事务的支持,性能得到了提升,特别是在一个可能会穿过多个服务器的系统里。

15. 为什么我的数据文件如此庞大?
MongoDB会积极的预分配预留空间来防止文件系统碎片。

16. 启用备份故障恢复需要多久?
从备份数据库声明主数据库宕机到选出一个备份数据库作为新的主数据库将花费10到30秒时间。这期间在主数据库上的操作将会失败--包括写入和强一致性读取(strong consistent read)操作。然而,你还能在第二数据库上执行最终一致性查询(eventually consistent query)(在slaveOk模式下),即使在这段时间里。

17. 什么是master或primary?
它是当前备份集群(replica set)中负责处理所有写入操作的主要节点/成员。在一个备份集群中,当失效备援(failover)事件发生时,一个另外的成员会变成primary。

18. 什么是secondary或slave?
Seconday从当前的primary上复制相应的操作。它是通过跟踪复制oplog(local.oplog.rs)做到的。

19. 我必须调用getLastError来确保写操作生效了么?
不用。不管你有没有调用getLastError(又叫"Safe Mode")服务器做的操作都一样。调用getLastError只是为了确认写操作成功提交了。当然,你经常想得到确认,但是写操作的安全性和是否生效不是由这个决定的。

20. Should I start out with sharded or with a non-sharded MongoDB environment? 我应该启动一个集群分片(sharded)还是一个非集群分片的 MongoDB 环境?
为开发便捷起见,我们建议以非集群分片(unsharded)方式开始一个 MongoDB 环境,除非一台服务器不足以存放你的初始数据集。从非集群分片升级到集群分片(sharding)是无缝的,所以在你的数据集还不是很大的时候没必要考虑集群分片(sharding)。

21. 分片(sharding)和复制(replication)是怎样工作的?
每一个分片(shard)是一个分区数据的逻辑集合。分片可能由单一服务器或者集群组成,我们推荐为每一个分片(shard)使用集群。

22. 数据在什么时候才会扩展到多个分片(shard)里?
MongoDB 分片是基于区域(range)的。所以一个集合(collection)中的所有的对象都被存放到一个块(chunk)中。只有当存在多余一个块的时候,才会有多个分片获取数据的选项(Only when there is more than 1 chunk is there an option for multiple shards to get data.)。现在,每个默认块的大小是 64Mb,所以你需要至少 64 Mb 空间才可以实施一个迁移。

23. 当我试图更新一个正在被迁移的块(chunk)上的文档时会发生什么?
更新操作会立即发生在旧的分片(shard)上,然后更改才会在所有权转移(ownership transfers)前复制到新的分片上。

24. 如果在一个分片(shard)停止或者很慢的时候,我发起一个查询会怎样?
如果一个分片(shard)停止了,除非查询设置了“Partial”选项,否则查询会返回一个错误。如果一个分片(shard)响应很慢,MongoDB则会等待它的响应。

25. 我可以把moveChunk目录里的旧文件删除吗?
没问题,这些文件是在分片(shard)进行均衡操作(balancing)的时候产生的临时文件。一旦这些操作已经完成,相关的临时文件也应该被删除掉。但目前清理工作是需要手动的,所以请小心地考虑再释放这些文件的空间。

26. 我怎么查看 Mongo 正在使用的链接?
db._adminCommand("connPoolStats");

27. 如果块移动操作(moveChunk)失败了,我需要手动清除部分转移的文档吗?
不需要,移动操作是一致(consistent)并且是确定性的(deterministic);一次失败后,移动操作会不断重试;当完成后,数据只会出现在新的分片里(shard)。

28. 如果我在使用复制技术(replication),可以一部分使用日志(journaling)而其他部分则不使用吗?
可以。

http://mp.weixin.qq.com/s?src=3&timestamp=1463219022&ver=1&signature=xlZQWoYDkMnaWMwK-u92oYO1d87hs6ireNQL7rWXHyb2PUiHnjixqnpK064hGZq*lwghynd-SlkSZAYgevYtJ0IgYjm0SGcueRsZXyxwjQPYhxu0*egLKaSr7aJMa9dytn-53PXXuko8sy5GCzJyiw==


延伸阅读:
http://www.baidu.com/s?wd=MySQL%20MongoDB%20区别
http://www.sogou.com/web?query=MySQL%20MongoDB%20区别
http://www.so.com/s?q=MySQL%20MongoDB%20区别

http://weixin.sogou.com/weixin?query=mysql%20mongodb%20区别&ie=utf8&type=2&sourceid=weixinvr
http://www.csdn.net/article/2012-09-06/2809618-mysql-vs-mongodb-complete

posted @ 2016-05-15 01:08  蔡华锋  阅读(...)  评论(... 编辑 收藏