【译】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则是非关系型数据库,也叫文档型数 ...
随机推荐
- eclipse如何新建项目发布到git
1.首先去查询本地git仓库地址 2.找到项目位置 删除git版本 3.更换git提交目标地址 目标地址是新建的git仓库地址 4.提交
- Firefox driver 那些事~
1. selenium 3.x开始,webdriver/firefox/webdriver.py的init中,executable_path="geckodriver":而2.x是 ...
- Java 读书笔记 (一) 基本知识
1. 基本概念 对象 对象是类的一个实例,有状态和行为. 例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行为有: 摇尾.叫.吃等. 类 类是一个模板,它描述一类对象的行为和状态. 方法 方法就 ...
- BITE
<Google软件测试之道> 读后感言: p147 提到的BITE实在是太让人心动了, 一个简单的动作即可提交一个信息齐全的bug,连非专业测试人员也能轻松做到.身边很多人也都碰到过提交b ...
- java Socket多线程聊天程序
参考JAVA 通过 Socket 实现 TCP 编程 参考java Socket多线程聊天程序(适合初学者) 以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包 ...
- ||与&&的返回值
当你准备携带你的配剑杀向江湖的时候,当你准备进入js这门语言的时候,你会遇到很多||与&&的问题.那么对于他们的返回值你知道多少呢? 在此之前我们来聊一个大家都知道的知识:js中值转换 ...
- Nginx重新编译添加新模块
找到nginx的安装包目录,如果没有的话去官网重新下载 查看ngixn版本极其编译参数 /usr/local/nginx/sbin/nginx -V 进入nginx源码目录,重新设置nginx ./c ...
- DB2数据库操作XMl字段
1.xml查询语句 ① 查询xml中的单个节点内容 select TM_PRM_OBJECT.ORG , TM_PRM_OBJECT.PARAM_CLASS , TM_PRM_OBJECT.PARAM ...
- shell的嵌入命令大全
围绕以下几点展开学习: 1.什么是shell的嵌入命令? 2.为什么使用shell? 3.怎样使用shell嵌入命令? 1.什么是shell的嵌入命令: ♦这些命令是在实际的Bourne shell里 ...
- STM32学习笔记(二):GPIO口工作原理
STM32每个IO口具有7个寄存器来控制,每个IO口都可以自由进行编程控制,我们编程实际上控制的是通过控制那7个寄存器来控制我们的IO口,我们可以通过编程控制IO口,把IO口配置成如下八种模式: 1. ...