【译】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则是非关系型数据库,也叫文档型数 ...
随机推荐
- linux中普通的文件查看操作(cat、more、less、head、tail)
cat:基本是最常用的查看文件内容的linux命令. more 也是用来查看一个文件的内容.当文件内容太多,一屏幕不能占下,而你用cat肯定是看不前面的内容的,那么使用more就可以解决这个问题了.当 ...
- Eclipse插件:mybatis generator的使用步骤
一.首先,安装eclipse插件 Help--Eclipser Marketplace中查找:Mybatis Generator 1.3.5安装 二.新建project New--other--查找如 ...
- Springboot+JPA+Thymeleaf 校园博客完整小网站
本文所属[知识林]:http://www.zslin.com/web/article/detail/35 此项目是一个比较简易的校园博客.麻雀虽小五脏俱全,虽然是比较简易的但是涉及的知识点还是比较全面 ...
- SpringCloud微框架系列整体模块梳理
以下为Spring Cloud的核心功能: 分布式/版本化配置服务注册和发现路由服务和服务之间的调用负载均衡断路器分布式消息传递 通过这张图,我们来了解一下各组件配置使用运行流程: 1.请求统一通过A ...
- toString()方法详解
在类型转换中,经常用到方法valueOf()和toString(),上一篇讲了valueOf()方法,这一篇来说说toString()方法.toSting()方法返回返回对象的字符串表现. [1]基本 ...
- 学会这15点,让你分分钟拿下Redis数据库
1.Redis简介 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统.Redis是一个开源的使用ANSI ...
- ApplicationContextAware 接口的作用
接口说明:当一个类实现了这个接口之后,这个类就可以方便地获得 ApplicationContext 中的所有bean.换句话说,就是这个类可以直接获取Spring配置文件中,所有有引用到的bean对象 ...
- backend_queue.go
package nsqd // BackendQueue represents the behavior for the secondary message // storage system typ ...
- CountDownLatch简介
CountDownLatch是并发包中提供的一个可用于控制多个线程同时开始某动作的类,可以看做是一个计数器,计数器操作是院子操作,同时只能有一个线程去操作这个计数器.可以向CountDownLatch ...
- Sql语言简介——检索数据
检索数据可以通过SELECT语句来实现. select子句:用于选择数据表.视图中的列. into子句:用于将原表中的结构和数据插入新表中. from子句:用于指定数据来源,包括表.视图和其他sele ...