一.MongoDB简介html
什么是MongoDB ?
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的状况下,添加更多的节点,能够保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档相似于 JSON 对象。字段值能够包含其余文档,数组及文档数组。node
主要特色
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安装简单。mysql
历史 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 发布,是目前最新的稳定版。web
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的管理工具。redis
监控
MongoDB提供了网络和系统监控工具Munin,它做为一个插件应用于MongoDB中。
Gangila是MongoDB高性能的系统监视的工具,它做为一个插件应用于MongoDB中。
基于图形界面的开源工具 Cacti, 用于查看CPU负载, 网络带宽利用率,它也提供了一个应用于监控 MongoDB 的插件。sql
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 应用案例
下面列举一些公司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
5、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
6、对比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
7、论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的区别的视频。
8、mongodb与mysql命令对比
mongodb与mysql命令对比 传统的关系数据库通常由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,可是集合中没有列、行和关系概念,这体现了模式自由的特色。
http://wenku.baidu.com/view/b7684e650b1c59eef8c7b449.html
9、在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×tamp=1463216453&ver=1&signature=jp5td-ycKfri2rb1m028aW*6H5KYa*L6KS5hxJAUSVcjuG-2Kei3LDrLixZfJ*FNVonAWMy-EGx1QRkFWU3WWhBrnAmOGEEsq9IZUq3CwJ3JR*fX0dU9OJ-76SFiGct6r-3SYzkehLDtPvXQBesVmQ==
10、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://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