【译】MongoDb vs Mysql—以NodeJs为例

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 MongoDB,通用型 2核4GB
简介: 【译】MongoDb vs Mysql—以NodeJs为例亲爱的读者,您可能想知道为什么要写关于MongoDb和MySql这篇文章。那是因为我与NodeJs开发人员讨论在应用程序中使用哪种数据存储作为主要的数据存储方式。

【译】MongoDb vs Mysql—以NodeJs为例
亲爱的读者,您可能想知道为什么要写关于MongoDb和MySql这篇文章。那是因为我与NodeJs开发人员讨论在应用程序中使用哪种数据存储作为主要的数据存储方式。 我看过很多评论都在争论这个问题。 有人说:“使用MongoDb,它更快并且更适合NodeJs应用”,其他人说:“使用关系数据库, 在MongoDb中不能方便的编写数据关联”。因此我决定去研究这两者之间的差别。  

  注意:不要将此看作是对这两者的完整研究。 本文只是在分享我的观点,不要误认为在说明使用这种技术好而另一种技术不好。

测试环境

  对于所有这些测试,我使用了MongoDb:最新的docker容器用于 MySQL。 4G 虚拟环境。 处理器:2.5 GHz Intel CoreI5。 对于查询,我使用了一个带有HapiJs的内置API。 对于这些技术最大程度地在他们最理想的环境使用。对于MongoDb和MySql使用本机驱动程序,并且没有启用缓存。

  我在三种不同的模型上进行了测试。

1、Mongo-flat - 这仅仅是一个对象结构。 集合中只嵌入一个带有住址的“用户” 集合。

2、 Mongo-relation –mongo 关系结构。包括两个集合:UsersAddress

3、 Mysql - 关系模式。两张表:UsersAddress

通常,“用户”与“地址”具有一对多的关系。

基准

1、插入 - 我使用Faker.js插入。插入使用两种方法进行:逐行插入和批量插入。批量插入5000条。

如上图所示,Mongo-flat批量插入耗时最少,因为MongoDb在设计时就是用高批量插入。 而MySql 这点不如MongoDb。

2、向用户添加地址

在这个例子中,MySql 耗时比较少。

3、删除记录

“Mongo-Flat” 在集合 Users中删除具有优势。 正如我上面提到的,MongoDb是为高写入和高删除设计的。 相反,Mysql可以却可以帮助删除使用外键约束 ON DELETE ... 的关系。这个在数据库中出现复杂关系时变得很方便。我不是建议一起删除记录,而是建议删除时使用软删除。换句话说,可以依靠数据库来完成。尽管比起MySql来说MongoDb不能这样做。对于在Mongo-relation中删除关系需要执行多个查询才可以完成,首先得到关系数据然后通过整个关系树才能去删除。

4、一次获得5000个用户

对于数据检索,MySql表现出更好的性能。检索用户mysql用了35毫秒时间,比mongo-relation快~14%,比mongo-flat快~12%。

5、统计用户

MySql表现的不如人意, Mongo-flat 和Mongo-relation 表现出非常好的结果。

6、获得5000个带有地址的用户

Mysql和Mongo-flat的表现大致相同,但是 mongo-relation关系却不是很好;这是因为在Mongo-relation检索中需要执行两个查询:一个检索用户,另一个检索其地址。在MySql的情况下它只是一个JOIN而在Mongo-flat的情况下只返回一个flat对象。

7、获取没有 Florida 地址的用户

Mysql和Mongo-Uat再次大致相同。 如上图Mongo-flat的速度与第六次测试基准对比开始下降,那是因为在`<> ‘Florida’ and {$ne:‘Florida’}‘中存在过滤。Mongo-relation再次很慢,因为为了执行这种查询他需要使用MongoDb聚合框架。

8、获取5000个地址

MySql再次表现出优良的性能,与此同时Mongo-Uat在只剩最后一行就完成。原因是MongoDb使用聚合框架; 在Mongo-flat检索中需要在嵌入式上聚合的数据地址关系。

9、计算地址

即使对我来说,这个结果也令人惊讶。正如上图所示,Mongo-flat比其他慢得多。还是因为聚合计算嵌入在Users集合中的地址是必要的。

10、根据where语句更新地址

在嵌入地址时随着更新数据的发生,Mongo-flat表现的更糟糕

11、获取所有Florida地址

Mongo-flat再次成为最后一个。 再次由于聚合框架。

结论

  从上面显示的所有测试中可以看到MongoDb在插入中表现非常好。 这是因为MongoDb设计时就能够写出大量数据。所以我可以得出MongoDb的结论最适合您需要大量写入的地方,例如日志记录或过渡数据。

  但是,MySql在数据检索方面却是非常好的。因此,如果没有大量数据插入或偶尔插入数据将MySql作为的业务数据存储,例如报告,客户管理等。

  通过测试,我认为MongoDb被用作关系数据库是错误的。仅仅使用MySql或任何其他基于Sql的数据库都会比MongoDb好用,它们专为关系数据库设计的。

  但如果你还在纠结,我会建议尝试下在两者之间添加关系键,回到Mongo-relation User-> Address schema将地址ID添加到User集合中作为嵌入,因为在某些情况下基于的“用户”地址ID。他更容易检索。Mongo-relation 允许每个集合库快速检索但是当你开始得到关系时,它会急剧减速,因为没有关联,为了得到关系就需要多次调用数据库。也可以加速通过批量检索数据然后加入相关集合来查询,但是后面这种方法,因为它可以使你的应用程序不可用,特别是如果使用单线程技术like NodeJs.像NodeJs。

  使用聚合时,Mongo-flat变得非常慢。 大多数情况这可能是唯一选择,特别是如果尝试.检索嵌入式关系。作为Sql语言聚合框架不够强大。因此对于某些查询,需要进行多次查询以实现最终结果。 所以之间的关系越深入就会变得非常复杂。

  使用Sql语言,它非常强大且易于编写,允许建立许多表关联; 它还包含了逻辑进入数据库,例如:表关联完成了数据库级别而不是应用程序级别。

  MySql可以慢吗?是的。但在我看来,这是因为低级的工程图表。有很多公司很多年来一直使用MySql作为他们的主要数据存储,因为它显示了良好的基准。

  Mongo和MySql都是很棒的技术。他们都有他们自己服务的目的。即使这样我们就应该替换另一个吗?绝对不。就像我之前说过MongoDb适用于过渡数据,日志,通知消息等。MySql适用于业务数据存储,报告,关系数据等 。

  在我的思想中我发现MongoDb用作关系数据库的地方失败的。同样,糟糕的决定会让你失败。 不要用MongoDb用于关系数据 - 这不是MongoDb的目的。

  我可以继续描述MongoDb和MySql,但我会在此停止让你做决定。我做了我的研究,你做了你的。但是,每一项技术都能达到目的。

这是一件有趣的事实。

能力有限,翻译的不是很好,请多指正。

原文地址:https://medium.com/@atasciuc/mongodb-vs-mysql-nodejs-paradigm-8bd21159075c

如果不能直接查看原文,附上附件:https://pan.baidu.com/s/1f17Y7d7Wz2oJnAh5A5D0-A

作者:Tynam.Yang

   出处:https://www.cnblogs.com/tynam/ 
相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
2月前
|
NoSQL 应用服务中间件 Linux
CentOS7搭建MySQL+Redis+MongoDB+FastDF
CentOS7搭建MySQL+Redis+MongoDB+FastDF
138 0
|
2月前
|
NoSQL 关系型数据库 MySQL
Windows、Linux、Mac安装数据库(mysql、MongoDB、Redis)#0
不同系统下进行MySQL安装、MongoDB安装、Redis安装【2月更文挑战第5天】
441 5
Windows、Linux、Mac安装数据库(mysql、MongoDB、Redis)#0
|
2月前
|
资源调度 JavaScript 关系型数据库
Node.js【文件系统模块、路径模块 、连接 MySQL、nodemon、操作 MySQL】(三)-全面详解(学习总结---从入门到深化)
Node.js【文件系统模块、路径模块 、连接 MySQL、nodemon、操作 MySQL】(三)-全面详解(学习总结---从入门到深化)
33 0
|
3月前
|
JavaScript 关系型数据库 MySQL
百度搜索:蓝易云【Node.js写接口连接MySQL数据库教程】
现在,你的Node.js应用已经启动,可以通过访问 `http://localhost:3000/users`来获取所有用户的信息。注意替换上述代码中的数据库连接信息为你自己的实际数据。
47 0
|
3月前
|
NoSQL 关系型数据库 MySQL
实习里项目使用mysql、mongodb、redis都用来干什么
实习里项目使用mysql、mongodb、redis都用来干什么
47 0
|
3月前
|
资源调度 JavaScript 关系型数据库
Node.js【文件系统模块、路径模块 、连接 MySQL、nodemon、操作 MySQL】(三)-全面详解(学习总结---从入门到深化)(下)
Node.js【文件系统模块、路径模块 、连接 MySQL、nodemon、操作 MySQL】(三)-全面详解(学习总结---从入门到深化)
18 0
|
3月前
|
JavaScript 关系型数据库 MySQL
Node.js【文件系统模块、路径模块 、连接 MySQL、nodemon、操作 MySQL】(三)-全面详解(学习总结---从入门到深化)(上)
Node.js【文件系统模块、路径模块 、连接 MySQL、nodemon、操作 MySQL】(三)-全面详解(学习总结---从入门到深化)
34 0
|
3月前
|
JavaScript 关系型数据库 MySQL
如何去掉 node.js 获取MySQL数据产生的RowDataPacket
如何去掉 node.js 获取MySQL数据产生的RowDataPacket
|
4月前
|
JavaScript 关系型数据库 MySQL
如何在 Node.js 中连接 MySQL 数据库
如何在 Node.js 中连接 MySQL 数据库
82 0
|
4月前
|
关系型数据库 MySQL 数据库
Node连接MySQL数据库进行基本的增删改查操作(一看就会)(二)
Node连接MySQL数据库进行基本的增删改查操作(一看就会)