新闻详情

这里有您想知道的最新资讯与动态

技术中心   /   新闻详情



MongoDB与MySQL性能对比
  • 作者:lxz
  • 发表时间:2018-1-28 10:28
  • 来源:未知

在当今的数据库市场上,MySQL无疑是占有一席之地的。作为一个开源的关系型数据库,MySQL被大量应用在各大网站后台中,承担着信息存储的重要作用。2009年,甲骨文公司(Oracle)收购Sun公司,MySQL成为Oracle旗下产品。 而MongoDB是一种文件导向的数据库管理系统,属于一种通称为NoSQL的数据库,是10gen公司旗下的开源产品,其内部数据存储的方式与传统的关系型数据有很大差别。 NoSQL的全称是Not Only SQL,也可以理解非关系型的数据库,是一种新型的革命式的数据库设计方式,不过它不是为了取代传统的关系型数据库而被设计的,它们分别代表了不同的数据库设计思路。 虽然MongoDB背后的公司没有Oracle强大,但其目前也正在被应用在各行各业中。MongoDB是目前被应用最广泛的NoSQL数据库产品。

MongoDB与MySQL的存储特点对比

非关系型数据库(NoSQL)与关系型数据库(SQL)对比:

NoSQL      SQL
简单便捷   数据实时一致性
方便扩展   支持事务
更好的性能   多表联合查询

在传统的关系型数据库中,数据是以表单为媒介进行存储的,每个表单均拥有纵向的列和横向的行。以MySQL为例,如果用户想以学生的学号为索引,存入其姓名与住址信息时,数据库中存放的信息便如下图所示:

ID Name Address
10001 Alice A1
10002 Bob A2
10003 Cara A3
10004 David A4
10005 Eve A5

上图表明数据库中存入了5个表项,其记录了学号为10001 – 10005的学生的姓名与住址信息。 如果用户欲把相应的信息重新存入MongoDB数据库,那么数据库中的信息应该为如下所示:

"_id" : "10001",
"Name" : "Alice",
"Address" : "A1",
 
"_id" : "10002",
"Name" : "Bob",
"Address" : "A2",
 
"_id" : "10003",
"Name" : " Cara",
"Address" : "A3",
 
"_id" : "10004",
"Name" : " David",
"Address" : "A4",
 
"_id" : "10005",
"Name" : " Eve",
"Address" : "A5",

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

对比两个数据库中数据存储的差异,你可能没有什么特别的直观感受。让我们再看看MongoDB存放的另一组数据:

"_id" : "10001",
"score" : {
           "Maths" : 71,
           "English" : 62,
}
 
"_id" : "10002",
"score" : {
           "Maths" : 81,
           "Chemistry" : 74,
           "Sport" : {
                       "Basketball" : 67,
                       "Badminton" : 76,
                   },
}

上述数据表明了学号为10001与10002两名学生的课程分数信息。如果想把同样的数据存入MySQL数据中的话,势必要很费一番功夫。在关系型数据库中,列的数目一般事先固定,各列之间可以由列名来识别。如果想存入以上数据,我们可以采取如下方法:

ID Maths English Chemistry Basketball Badminton
10001 71 62 null null null
10002 82 null 74 67 76

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在开始就定义好了。对运维人员来说,他们可能不清楚数据库内部数据的数据格式,这也会数据库的运维带来了麻烦。