MySQL与MongoDB的区别

什么是MongoDB ?
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

主要特点
MongoDB的提供了一个面向文档存储,操作起来比较简单和容易。

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安装简单。


二.MongoDB和MySQL比较

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

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

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

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

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

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

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

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

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

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

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. 事务关系支持薄弱。这也是所有NoSQL数据库共同的缺陷,不过NoSQL并不是为了事务关系而设计的,具体应用还是很需求。

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

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

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

对比MySQL,你究竟在什么时候更需要MongoDB:

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

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

以下为译文: 
NoSQL已经流行了很长一段时间,那么究竟是什么场景下你才更需要用到这些“新兴事物”,就比如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去修改数据库模式。

八、mongodb与mysql命令对比

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

项目中使用MySql与MongoDb的一些对比:

MySQL是关系型数据库中的明星,MongoDB是文档型数据库中的翘楚。下面通过一个设计实例对比一下二者:假设我们正在维护一个手机产品库,里面除了包含手机的名称,品牌等基本信息,还包含了待机时间,外观设计等参数信息,应该如何存取数据呢?

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

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

CREATE TABLE IF NOT EXISTS `mobiles` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` VARCHAR(100) NOT NULL,
 `brand` VARCHAR(100) NOT NULL,
 PRIMARY KEY (`id`)  );
CREATE TABLE IF NOT EXISTS `mobile_params` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `mobile_id` int(10) unsigned NOT NULL,
 `name` varchar(100) NOT NULL,
`value` varchar(100) NOT NULL,
 PRIMARY KEY (`id`) );

 INSERT INTO `mobiles` (`id`, `name`, `brand`) VALUES
 (1, 'ME525', '摩托罗拉'),
(2, 'E7' , '诺基亚');  
 INSERT INTO `mobile_params` (`id`, `mobile_id`, `name`, `value`) VALUES
 (1, 1, '待机时间', '200'),
 (2, 1, '外观设计', '直板'),
 (3, 2, '待机时间', '500'),
 (4, 2, '外观设计', '滑盖');

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

1 SELECT * FROM `mobile_params` WHERE name = '待机时间' AND value > 100;
2 SELECT * FROM `mobile_params` WHERE name = '外观设计' AND value = '直板'

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

 db.getCollection("mobiles").ensureIndex({
 "params.name": 1,
 "params.value": 1
});

 db.getCollection("mobiles").insert({
"_id": 1,
 "name": "ME525",
 "brand": "摩托罗拉",
"params": [
 {"name": "待机时间", "value": 200},
{"name": "外观设计", "value": "直板"}
]});

db.getCollection("mobiles").insert({
 "_id": 2,
 "name": "E7",
"brand": "诺基亚",
"params": [
{"name": "待机时间", "value": 500},
{"name": "外观设计", "value": "滑盖"}
]
});

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

view sourceprint?
 db.getCollection("mobiles").find({
 "params": {
 $all: [
 {$elemMatch: {"name": "待机时间", "value": {$gt: 100}}},
 {$elemMatch: {"name": "外观设计", "value": "直板"}}
]
}
});





本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

webService上传图片

1 webService 2 3 /// <summary>4 /// 上传图片webServer 的摘要说明5 /// </summary>6 [WebService(Namespace "http://tempuri.org/")]7 [WebServiceBinding(ConformsTo WsiProfiles.BasicProfile1_1)]8 [ToolboxItem(fal…

在陌生Linux环境查看Tomcat服务的方法

1.查看Tomcat进程 执行命令$ps -ef|grep tomcat 你就能找出tomcat占据的进程号&#xff0c;当然这要求tomcat启动了。 # ps -ef | grep tomcat 2.查看Tomcat占据的端口 执行命令$netstat -nat能列出tomcat占据的端口&#xff0c;8080及其它类似的端口是需要注意的。这命令也需要…

查看WEB服务器的连接数

查看WEB服务器的连接数 https://technet.microsoft.com/en-us/sysinternals/bb897437 tcpView转载于:https://www.cnblogs.com/daishuguang/p/4973342.html

JVM系列三:JVM参数设置、分析

转载自&#xff1a; http://www.cnblogs.com/redcreen/archive/2011/05/04/2037057.html 不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM、GC的参数&#xff0c;可以极大的减少由于GC工作&#xff0c;而导致的程序运行中断方面的问题…

堆溢出,栈溢出

堆溢出:不断的new 一个对象&#xff0c;一直创建新的对象&#xff0c; 栈溢出&#xff1a;死循环或者是递归太深&#xff0c;递归的原因&#xff0c;可能太大&#xff0c;也可能没有终止。 在一次函数调用中&#xff0c;栈中将被依次压入&#xff1a;参数&#xff0c;返回地址&…

Information_Schema系统表

information_schema数据库是MySQL自带的&#xff0c;它提供了访问数据库元数据的方式。 元数据是关于数据的数据&#xff0c;如数据库名或表名&#xff0c;列的数据类型&#xff0c;或访问权限等。有些时候用于表述该信息的其他术语包括“数据词典”和“系统目录”。 在…

天赋是牛人的基因?

最近听了吴瀚清&#xff08;俗称道哥&#xff09;分享安全&#xff0c;他是西安交大少年班毕业&#xff0c;专注于安全技术领域&#xff0c;23 岁加入阿里巴巴成为集团最年轻的高级技术专家&#xff0c;目前在阿里任 P10 职级。对于这类少年天才&#xff0c;一般会冠与神童的美…

最长回文Manacher

预处理: 判断一个串是不是回文串&#xff0c;往往要分开编写&#xff0c;造成代码的拖沓 int LongestPalindrome(const char * s, int n){ int i, j, max; if (s 0 || n < 1) return 0; max 0; for (i 0; i < n; i){//i is the middle point of palindrome for (j 0;…

链表面试笔试题目总结

链表是最基本的数据结构&#xff0c;凡是学计算机的必须的掌握的&#xff0c;在面试的时候经常被问到&#xff0c;关于链表的实现&#xff0c;百度一下就知道了。在此可以讨论一下与链表相关的练习题。 1、在单链表上插入一个元素&#xff0c;要求时间复杂度为O(1) 解答&#x…

linux下常用FTP命令

linux下常用FTP命令 1. 连接ftp服务器 1. 连接ftp服务器格式&#xff1a;ftp [hostname| ip-address]a)在linux命令行下输入&#xff1a; ftp 192.168.1.1b)服务器询问你用户名和密码&#xff0c;分别输入用户名和相应密码&#xff0c;待认证通过即可。 2. 下载文件 下载文件通…

线程、多线程与线程池

线程&#xff1a;进程中负责程序执行的执行单元。一个进程中至少有一个线程。 多线程&#xff1a;解决多任务同时执行的需求&#xff0c;合理使用CPU资源。多线程的运行是根据CPU切换完成&#xff0c;如何切换由CPU决定&#xff0c;因此多线程运行具有不确定性。 线程池&…

selenium webdriver python 元素操作

常用操作 click 点击某个元素driver.find_element_by_id(“su”).click()cleardriver.find_element_by_id(“kw”).clear()send_keys模拟键盘输入driver.find_element_by_id(“kw”).send_keys(“hello”)from selenium.webdriver.common.keys import Keysdriver.find_element_…