【译】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-uat快~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再次大致相同。 As如上图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