何时使用MongoDB而不是MySql
什么是 MySQL 和 MongoDB
MySQL 和 MongoDB 是两个可用于存储和管理数据的数据库管理系统。MySQL 是一个关系数据库系统,以结构化表格格式存储数据。相比之下,MongoDB 以更灵活的格式将数据存储为 JSON 文档。两者都提供性能和可扩展性,但它们为不同的应用场景提供了更好的性能。

MySQL 是一种关系型数据库管理系统,它使用结构化查询语言(SQL)来操作数据。SQL 是一种通用的、标准化的、声明式的语言,它可以定义数据的结构、约束、操作、查询等。MySQL 使用表(table)来存储数据,表由行(row)和列(column)组成,每一行代表一条记录,每一列代表一个属性。表之间可以通过主键(primary key)和外键(foreign key)来建立关联,实现数据的完整性和一致性。

MongoDB 是一种非关系型数据库管理系统,它使用文档(document)来存储数据。文档是一种类似于 JSON 的格式,它由键值对(key-value pair)组成,每一个键值对代表一个属性。文档之间没有固定的结构,可以根据需要灵活地添加或删除属性。文档存储在集合(collection)中,集合类似于表,但没有预定义的模式(schema)。集合之间可以通过引用(reference)或嵌入(embedding)来建立关联,实现数据的灵活性和效率。
推荐博主开源的 H5 商城项目waynboot-mall,这是一套全部开源的微商城项目,包含三个项目:运营后台、H5 商城前台和服务端接口。实现了商城所需的首页展示、商品分类、商品详情、商品 sku、分词搜索、购物车、结算下单、支付宝/微信支付、收单评论以及完善的后台管理等一系列功能。 技术上基于最新得 Springboot3.0、jdk17,整合了 MySql、Redis、RabbitMQ、ElasticSearch 等常用中间件。分模块设计、简洁易维护,欢迎大家点个 star、关注博主。
github 地址:https://github.com/wayn111/waynboot-mall
相似之处
MySQL 和 MongoDB 都是数据库管理系统。它们存储数据并具有内置的用户界面和查询语言,因此我们都可以进行添加、编辑、修改和分析数据等操作。
开源许可证
MySQL 和早期版本的 MongoDB 都有开源许可证,可以免费下载开源版本。我们可以根据需要对代码执行的操作来对其进行修改。
MySQL 使用 GPL 协议,使得任何人均可以免费使用 MySQL 并且可以对其进行代码修改。而 MonogoDB 在 2018 年 10 月 16 日更改 License 为 SSPL 协议,这对于开源社区没啥影响,但是对于云厂商而言 MongoDB 公司会明确要求托管 MongoDB 实例的云厂商要么从 MongoDB 公司获取商业许可证,要么向社区开源其服务代码。
索引支持
MySQL 和 MongoDB 使用索引来提高查询速度和性能。索引是加快数据查询的一种数据库结构,有助于非常快速地查找和检索数据。
MySQL 和 MongoDB 数据库平台都使用哈希索引、B- 树(MySql实际使用的是B+ 树)索引和其他几种索引。
用户界面
MongoDB 和 MySQL 都易于使用。它们提供基于自然语言的查询语言来更新和读取数据,还提供图形用户界面(GUI),以便更直观地管理和分析数据。
编程语言
MySQL 和 MongoDB 与各种相同的编程语言兼容。MongoDB 和 MySQL 都可以与 Java、Python、Node.js、PHP、Ruby 以及 C# 结合使用。
安全性
MySQL 和 MongoDB 都使用身份验证、访问控制和加密手段来确保其数据库的安全。它们使用 TLS/SSL 加密来保护传输中数据和静态数据,还允许定义不同的用户访问级别。
文档和社区支持
MySQL 和 MongoDB 在各自的网站上都有详细的官方文档。两者的教程、手册和指南包含安装、配置和运行操作任务的完整说明。
MongoDB 和 MySQL 都有一个活跃的开发人员社区,可以回答问题并帮助进行故障排除。它们还提供企业版,针对特定要求提供专属支持。
主要区别
MySQL 是一个关系数据库管理系统,MongoDB 则是一个 NoSQL 数据库系统。MySQL 使用 SQL,大多数开发人员都有这方面的经验。相反 MongoDB 使用 MongoDB 查询语言(MQL)。尽管 MQL 和 SQL 有相似之处,但 MQL 通常需要额外花费精力进行学习。 接下来,博主将介绍一些主要差异。
数据模型
MySQL 是一个关系数据库系统,它将数据存储在列、行和表中。我们将数据存储在行中,每列代表不同类型的数据。然后我们就可以使用外键和主键定义数据之间的关系。每个表都有一个用于标识它的主键,外键用于创建关系。
MongoDB 是一个面向文档的数据库,将其所有数据存储为二进制 JSON(BSON)文档。BSON 允许序列化多种形式的数据。使用 BSON 文档可以存储非结构化、半结构化和结构化数据。MongoDB 没有使用数据库架构,而是采用了一种灵活的方法,将文档存储在集合中。
可扩展性
在 MySQL 数据库系统中,可用的扩展选项是有限的。有以下方案可供选择:
- 通过向当前数据库服务器添加更多资源来实现纵向可扩展性
- 通过在其他服务器上创建数据库的只读副本来读取复制
创建制度副本有限制,最多只能有五个副本。副本还可能滞后于主副本,会造成一致性问题。纵向可扩展性也受限于单机性能瓶颈。
相比之下,MongoDB 在可扩展性方面具有显著的优势。它具有两个用于扩展的关键功能:
- 副本集 — 包含相同数据的 MongoDB 服务器备份
- 分片 — 将数据分布在不同的服务器上
MongoDB 允许创建分片集群,因此我们的部分数据将在多个服务器上复制。例如如果我们有大量的客户记录,则可以对其进行分发,以便将 A-J 的姓名和 K-Z 的姓名保存在各自的副本集中。因此 MongoDB 可以横向扩展,以大规模优化读写性能。
性能
MySQL 设计为可在建立适当索引的多个表之间实现高性能连接。但是它需要逐行插入数据,因此写入性能较慢。
MongoDB 文档遵循分层数据模型,将大部分数据保存在单个文档中,从而减少了跨多个文档进行联接的需要。通过 $lookup 操作支持联接,但并未针对性能对其进行优化。但是 MongoDB 提供了 insertMany() API,用于快速插入数据,可优先考虑写入性能。
灵活性
作为关系数据库管理系统,MySQL 的结构比 MongoDB 更严格。MySQL 使用固定架构,将数据整理成行和表。必须将数据结构化并放入表格系统中才能使用 MySQL。
通过将数据存储为 JSON 文档,MongoDB 允许构建具有许多不同数据类型的复杂应用程序。例如可以通过更新嵌套数组字段来创建新字段。还可以使用聚合管道(这是一个 MongoDB 功能),允许通过将多个操作合并为一个工作流程来转换数据。
访问控制
在 MongoDB 中,可以控制操作、集合或数据库级别的访问权限。它使用 Kerberos、X.509 和 LDAP 证书对用户进行身份验证。相比之下,MySQL 允许在用户、数据库和表级别上限制用户访问权限。MySQL 使用自己的身份验证系统。它会在 SQL 注入攻击中带来另一个安全漏洞,MongoDB 的无架构方法则可以避免这个漏洞。
差异表格
| MongoDB | MySql | |
|---|---|---|
| 数据模型 | MongoDB 将数据存储在 JSON 文档中,然后将其整理成集合。 | MySQL 将数据存储在列和行中。数据存储是表格式和关系式的。 |
| 可扩展性 | MongoDB 使用复制和分片进行水平扩展。 | MySQL 使用纵向扩展和只读副本来大规模提高性能。 |
| 查询语言 | MongoDB 使用 MongoDB 查询语言。 | MySQL 使用 SQL。 |
| 性能 | MongoDB 擅长插入或更新大量记录。 | 查询大量记录时,MySQL 的速度更快。 |
| 灵活性 | MongoDB 没有架构,因此具有更大的灵活性,并且能够处理非结构化、半结构化和结构化数据。 | MySQL 有严格的架构,可以很好地处理结构化数据。 |
| 安全性 | MongoDB 使用 Kerberos、X.509 和 LDAP 证书对用户进行身份验证。 | MySQL 使用内置的身份验证方法。 |
优缺点
MySQL 和 MongoDB 各有优缺点,如下展示:
MySQL 的优点:
- 成熟稳定:MySQL 是一个历史悠久、广泛使用、经过测试的数据库系统,有着丰富的文档和社区支持。
- 易用强大:MySQL 提供了一个简单易用、功能强大的 SQL 语言,可以实现复杂的查询和操作。
- 数据安全:MySQL 支持 ACID 事务,可以保证数据的完整性和一致性,避免数据丢失或错误。
MySQL 的缺点:
- 灵活性低:MySQL 需要预先定义好数据的结构和类型,不适合存储动态变化或非结构化的数据。
- 扩展性差:MySQL 只支持垂直扩展,不适合处理海量或分布式的数据。
- 性能瓶颈:MySQL 在处理大量的连接、并发、索引、关联等操作时,可能会出现性能瓶颈或故障。
MongoDB 的优点:
- 灵活性高:MongoDB 使用文档模型,可以动态地调整数据的结构和类型,适合存储动态变化或非结构化的数据。
- 扩展性好:MongoDB 支持水平扩展,可以处理海量或分布式的数据,提高系统的可用性和容错性。
- 性能高效:MongoDB 在处理大量的读写、索引、嵌入等操作时,可以实现高效的性能和吞吐量。
MongoDB 的缺点:
- 难用复杂:MongoDB 提供了一个难用复杂、功能有限的 MQL 语言,不能实现复杂的查询和操作。
- 数据不安全:MongoDB 不支持 ACID 事务,不能保证数据的完整性和一致性,可能导致数据丢失或错误。
应用场景
MySQL 和 MongoDB 适合不同的应用场景,以下是一些主要的例子:
MySQL 适合以下场景:
- MySQL 中的数据存储格式使其适用于数据仓库和在线分析处理。它符合 ACID 标准,这使得 MySQL 适用于处理复杂事务,例如在电子商务、交易应用场景中。
- 需要确保数据安全、一致性、可靠性等特性的场景,例如政府、金融等领域。
MongoDB 适合以下场景:
- MongoDB 在社交网络、媒体或物联网(IoT)等应用场景中处理非结构化数据时,该数据库更为合适。
- 需要进行大量的读写、索引、嵌入等操作的场景,并且需要数据可扩展可变化,例如内容管理、个性化推荐等领域。
关注公众号【waynblog】每周分享技术干货、开源项目、实战经验、高效开发工具等,您的关注将是我的更新动力!
何时使用MongoDB而不是MySql的更多相关文章
- Ubuntu 16.04 LAMP server 指南 - 配置 Apache2.4,PHP7,和MariaDB(而不是MySQL)
翻译自:https://www.howtoforge.com/tutorial/install-apache-with-php-and-mysql-on-ubuntu-16-04-lamp/ 昨天在虚 ...
- 为什么选择PostgreSQL而不是MySQL
David Bolton是一名独立开发者,他使用PostgreSQL和MySQL都已有超过十年的时间.近日,他撰文阐述了选择PostgreSQL而不是MySQL的理由.他认为,MySQL之所以仍然如此 ...
- mongodb数据到MySQL数据库 的迁移步骤
废话少说,直接上干货. 1.mongoexport -d shengyang -c testData -f _id,x,name,name1,name2 --type=csv -o new.csv 用 ...
- mongodb/python3.6/mysql的安装
1 下载与解压 在官网下载mongodb安装包 tar -zxvf mongodb-linux-x86_64-ubuntu1604-3.4.0.tgz 2 移动安装文件 sudo mv mongodb ...
- Mongodb cassandra 和 Mysql对比
MongoDBDB.Cassandra和 Mysql对比 1.为什么是Nosql? 1.1 Nosql在大数据处理相对于关系型数据库具有优势 1.1.1 1. 低延迟 ...
- mongodb为什么比mysql效率高
首先是内存映射机制,数据不是持久化到存储设备中的,而是暂时存储在内存中,这就提高了在IO上效率以及操作系统对存储介质之间的性能损耗.(毕竟内存读取最快) 其次,NoSQL并不是不使用sql,只是不使用 ...
- 170504、MongoDB和MySQL对比(译)
一.概要 几十年来,关系型数据库已经成为企业应用程序的基础,自从MySQL在1995年发布以来,它已经成为一种受欢迎并且廉价的选择.然而随着近年来数据量和数据的不断激增,非关系数据库技术如MongoD ...
- 清晰架构(Clean Architecture)的Go微服务: 设计原则
我最近写了一个Go微服务应用程序,这个程序的设计来自三个灵感: 清晰架构"Clean Architecture"¹ and SOLID (面向对象设计)² 设计 原则³ Sprin ...
- [转]mongodb与mysql相比的优缺点
原文地址:http://blog.sina.com.cn/s/blog_966e430001019s8v.html 与关系型数据库相比,MongoDB的优点:①弱一致性(最终一致),更能保证用户的访问 ...
- MongoDB 与传统关系型数据库mysql比较
与关系型数据库相比,MongoDB的优点: 转载自 http://blog.sina.com.cn/s/blog_966e430001019s8v.html①弱一致性(最终一致),更能保证用户的访问 ...
随机推荐
- DVWA文件上传
Low安全级别: <?php @eval($_POST['cmd']);?> 文本编辑器写入一句话木马,保存并改为php文件. 上传 成功上传,并返回路径 打开菜刀客户端连接 成功连接 反 ...
- 2020-08-25:BloomFilter的原理以及Zset的实现原理。
福哥答案2020-08-25: 布隆过滤器:哈希+位图.布隆过滤器重要的三个公式1.假设数据量为n,预期的失误率为p(布隆过滤器大小和每个样本的大小无关).2.根据n和p,算出BloomFilter一 ...
- 2020-09-18:LRU手撸,说下时间复杂度和空间复杂度。
福哥答案2020-09-18: 方法:哈希表 + 双向链表.时间复杂度:对于 put 和 get 都是 O(1).空间复杂度:O(capacity),因为哈希表和双向链表最多存储 capacity+1 ...
- .NET周报 【5月第2期 2023-05-14】
国内文章 XUnit数据共享与并行测试 https://www.cnblogs.com/podolski/p/17388602.html 在单元或者集成测试的过程中,需要测试的用例非常多,如果测试是一 ...
- 程序员的 Windows 工具箱「GitHub 热点速览」
如何精简 Windows 并快速配置开发环境呢?本周特推的 winutil 是一个程序员的 Windows 工具箱,它提供了开发工具的一键安装以及减少系统垃圾的功能,一切为了简洁.高效.同样高效的还有 ...
- Vuex modules 中active相互调用
大中型项目中使用vuex进行状态管理时,经常会按模块分割到不同的module中去,而操作中难免有模块中的active相互调用的情况,然而有时也会出现一些问题,这里顺便记录下 store目录结构 在us ...
- Java实现Kafka生产者和消费者的示例
Kafka简介 Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写.Kafka的目标是为处理实时数据提供一个统一.高吞吐.低延迟的平台. 文章持续更新,微信搜索「 ...
- 曲线艺术编程 coding curves 第六章 平托图 (Pintographs)
第六章 平托图 (Pintographs) 原作:Keith Peters https://www.bit-101.com/blog/2022/11/coding-curves/ 译者:池中物王二狗( ...
- .Net7基础类型的优化和循环克隆优化
前言 .Net7里面对于基础类型的优化,是必不可少的.因为这些基础类型基本上都会经常用到,本篇除了基础类型的优化介绍之外,还有一个循环克隆的优化特性,也一并看下. 概括 1.基础类型优化 基础类型的优 ...
- Centos6yum源切换
CentOS 6操作系统版本结束了生命周期(EOL),Linux社区已不再维护该操作系统版本.建议您升级操作系统至CentOS 7及以上,如果您的业务过渡期仍需要使用CentOS 6系统中的一些安装包 ...