【译】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 关系结构。包括两个集合:`Users`和`Address`。

3、 Mysql - 关系模式。两张表:`Users`和`Address`

通常,“用户”与“地址”具有一对多的关系。
基准
1、插入 - 我使用`Faker.js`插入。插入使用两种方法进行:逐行插入和批量插入。批量插入5000条。

如上图所示,Mongo-flat批量插入耗时最少,因为MongoDb在设计时就是用高批量插入。 而MySql 这点不如MongoDb。
2、向用户添加地址
在这个例子中,MySql 耗时比较少。
3、删除记录

“Mongo-Flat” 在集合 `Users`.`Users`中删除具有优势。 As I mentioned earlier MongoDb was designed for high writes正如我上面提到的,MongoDb是为高写入和高删除设计的。 相反,Mysql可以却可以帮助删除使用外键约束 `ON DELETE ... `的关系。这个becomes handy in case of complicated relationships in your database.在数据库中出现复杂关系时变得很方便。the relations if you use foreign key constrains`ON DELETE … `.ThisI我不是would not recommend deleting the record all together, please use soft-建议一起删除记录,而是建议删除时使用软deletes.删除。In other words, you could rely on the database to do the job for换句话说,可以依靠数据库来完成。尽管比起MySql来说MongoDb不能这样做。对于在`Mongo-relation`中To delete a 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
【译】MongoDb vs Mysql—以NodeJs为例的更多相关文章
- 170504、MongoDB和MySQL对比(译)
一.概要 几十年来,关系型数据库已经成为企业应用程序的基础,自从MySQL在1995年发布以来,它已经成为一种受欢迎并且廉价的选择.然而随着近年来数据量和数据的不断激增,非关系数据库技术如MongoD ...
- MongoDB与Mysql常用命令解释
原文 本文旨在介绍MongoDB,Mysql的常用命令:将MongoDB 和传统的关系型数据库的常用命令对照起来学习,更加便于记忆和理解. MongoDB是由数据库(database/reposito ...
- MongoDB之一介绍(MongoDB与MySQL的区别、BSON与JSON的区别)
MySQL与MongoDB的操作对比,以及区别 MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL ...
- MongoDB 和 mySql 的关系
1. mysql 和 MongoDb MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库. ...
- MongoDB与MySQL的插入、查询性能测试
1.1 MongoDB的简单介绍 在当今的数据库市场上,MySQL无疑是占有一席之地的.作为一个开源的关系型数据库,MySQL被大量应用在各大网站后台中,承担着信息存储的重要作用.2009年,甲骨文 ...
- mongodb,redis,mysql的区别和具体应用场景
一.MySQL 关系型数据库. 在不同的引擎上有不同 的存储方式. 查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高. 开源数据库的份额在不断增加,mysql的份额页在持续增长. 缺点就 ...
- scrapy抓取拉勾网职位信息(七)——数据存储(MongoDB,Mysql,本地CSV)
上一篇完成了随机UA和随机代理的设置,让爬虫能更稳定的运行,本篇将爬取好的数据进行存储,包括本地文件,关系型数据库(以Mysql为例),非关系型数据库(以MongoDB为例). 实际上我们在编写爬虫r ...
- MongoDB与MySQL的插入性能测试【转】
1.1 MongoDB的简单介绍 在当今的数据库市场上,MySQL无疑是占有一席之地的.作为一个开源的关系型数据库,MySQL被大量应用在各大网站后台中,承担着信息存储的重要作用.2009年,甲骨文 ...
- Mongodb学习总结(2)——MongoDB与MySQL区别及其使用场景对比
对于只有SQL背景的人来说,想要深入研究NoSQL似乎是一个艰巨的任务,MySQL与MongoDB都是开源常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数 ...
随机推荐
- 加密原理介绍,代码实现DES、AES、RSA、Base64、MD5
阅读目录 github下载地址 一.DES对称加密 二.AES对称加密 三.RSA非对称加密 四.实际使用 五.关于Padding 关于电脑终端Openssl加密解密命令 关于网络安全的数据加密部分, ...
- 区分命令行模式和Python交互模式
命令行模式 在Windows开始菜单选择"命令提示符",就进入到命令行模式,它的提示符类似C:\> Python交互模式 在命令行模式下敲命令python,就看到类似如下的一 ...
- SDKManager连不上墙外的网,列表刷新不出来怎么办?
现在我们都无法正常访问外国的网站了,尤其是Google,这个也没了,问题出不去,好多东西都解决的不是很好,包括SDKManager这个都无法刷新列表,当然在这里,我没有介绍你使用VPN的使用,这样做就 ...
- 关于Linux虚拟化技术KVM的科普 科普二(KVM虚拟机代码揭秘)
代码分析文章<KVM虚拟机代码揭秘--QEMU代码结构分析>.<KVM虚拟机代码揭秘--中断虚拟化>.<KVM虚拟机代码揭秘--设备IO虚拟化>.<KVM虚拟 ...
- Java JFrame图形界面 ----一个简单的窗口
#开始 申请博客已经有一段时间了 但是一直没有时间写博文(其实还是懒虫侵蚀了大脑) 最近正在学习JFrame做窗口 遇到了很多的问题 为了解决问题也谋杀了很多的脑细胞 为了让更多的朋友不死的很多脑细胞 ...
- InnoDB基本特性
Ⅰ.double write 目的:保证数据写入的可靠性 小知识: 什么是partial write? 16k的page只写入了4k,6k,8k,12k就断掉了的情况 corrupt的page就是pa ...
- PHP写的爬虫,爬指定网站页面上的各种图片
打算用php实现一个爬虫,这是爬指定页面的图片的一段程序,其他的部分还没调试好,先把这个放上来 <?php $string=file_get_contents("http://www. ...
- app后端设计(4)-- 通讯的安全性
在app的后台设计中,一个很重要的因素是考虑通讯的安全性. 因此,我们需要考虑的要点有: 1. 在app和后台,都不能保存任何用户密码的明文 2. 在app和后台通讯的过程中,怎么保证用户信息的安全性 ...
- Netty 学习 一、初识Netty【原创】
在过去几年的工作和学习中,比较关注高层次的应用开发,对底层探究较少.实现Web应用的开发,主要依赖Tomcat.Apache等应用服务器,程序员无需了解底层协议,但同样限制了应用的性能和效率.现在开始 ...
- Angular 6的新特性介绍
2018年5月4日,Angular6.0.0版正式发布,新版本主要关注底层框架和工具链,目的在于使其变得更小更快.下面就介绍下新版本的一些主要新特性,供大家参考. ng update ng updat ...