亲爱的读者, 您可能想知道为什么要写关于 MongoDB 和 MySQL 这篇文章. 那是因为我与 Node.JS 开发人员讨论在应用程序中使用哪种数据存储作为主要的数据存储方式. 我看过很多评论都在争论这个问题. 有人说:"使用 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 Node.JS. 像 Node.JS.
使用聚合时, Mongo-flat 变得非常慢. 大多数情况这可能是唯一选择, 特别是如果尝试. 检索嵌入式关系. 作为 Sql 语言聚合框架不够强大. 因此对于某些查询, 需要进行多次查询以实现最终结果. 所以之间的关系越深入就会变得非常复杂.
使用 Sql 语言, 它非常强大且易于编写, 允许建立许多表关联; 它还包含了逻辑进入数据库, 例如: 表关联完成了数据库级别而不是应用程序级别.
MySQL 可以慢吗? 是的. 但在我看来, 这是因为低级的工程图表. 有很多公司很多年来一直使用 MySQL 作为他们的主要数据存储, 因为它显示了良好的基准.
Mongo 和 MySQL 都是很棒的技术. 他们都有他们自己服务的目的. 即使这样我们就应该替换另一个吗? 绝对不. 就像我之前说过 MongoDB 适用于过渡数据, 日志, 通知消息等. MySQL 适用于业务数据存储, 报告, 关系数据等 .
在我的思想中我发现 MongoDB 用作关系数据库的地方失败的. 同样, 糟糕的决定会让你失败. 不要用 MongoDB 用于关系数据 - 这不是 MongoDB 的目的.
我可以继续描述 MongoDB 和 MySQL, 但我会在此停止让你做决定. 我做了我的研究, 你做了你的. 但是, 每一项技术都能达到目的.
这是一件有趣的事实.
能力有限, 翻译的不是很好, 请多指正.
来源: https://www.cnblogs.com/tynam/p/10629109.html