MongoDB与MySQL,该如何从中选用数据库?

译文
数据库 MongoDB
本文将和您从数据模式与能力、性能与速度、安全性、以及查询语言等方面,讨论MongoDB和MySQL的各自优缺点,以方便您在实践应用中做出明智的选择。

[[392941]]

【51CTO.com快译】不可否认,MongoDB和MySQL都是性能极其卓越的数据库。但是,它们在不同领域却各有所长。本文将和您一起讨论两者的各自特征、区别、以及在不同环境下的各种优缺点,以方便您在实践应用中做出明智的选择。

什么是MySQL?

自1995年被投入市场以来,MySQL以其易用性和可靠性,在业界享有不菲的声誉。开源的MySQL属于关系型数据库管理系统(RDBMS)。更具体地说,RDBMS是用于更新、管理和规划关系型数据库的实用程序。以数据表为基础的关系型数据库,允许在同一数据库中存放彼此相关、却又属于不同种类的数据。由于数据库架构是根据某些特定条件和规则预先定义的,因此数据通常是按照行和列组织起来,以反应表的不同字段之间的关系。除了MySQL,我们常见的PostgreSQL和SQL也属于RDBMS,它们都拥有各自对于结构化查询语言(SQL)的变体语言。

什么是MongoDB?

虽然MongoDB也是开源的,但是与MySQL不同,它是一种文档数据存储库。也就是说,它会将文档存储在集合之中,而不是存储有相互关系的数据表里。

在使用MongoDB时,数据模式(data schema)并不固定。用户可以通过删除或修改集合中的文档属性,以实现高度灵活性。纵然是属于同一个集合中的文档,它们也会有着完全不同的结构。

总的说来,MySQL和MongoDB的共同点是:它们都开源且易于访问。而且,两者都提供具有附加功能的商业版本。两者的不同之处在于:MySQL是关系型,而MongoDB是非关系型。

MongoDB与MySQL之间的差异

下面,我们将从数据模式与能力、性能与速度、安全性、以及查询语言等方面,来讨论关系型的MySQL与文档数据存储类的MongoDB到底有何差异。

数据模式和能力

与JSON文档类似,MongoDB中的数据是以键值对(key-value pairs)的形式显示的。因此,在模式设计上,数据库受到的约束更少。而这对于具有快速增长或其他变化需求的数据来说,是非常有利的。如下图所示,MongoDB提供了预定义的结构,用户可以按需采用其结构。

资料来源:MongoDB

虽然MySQL可以其数据模式,但不如文档数据库那样灵活且动态。在存储任何数据之前,MySQL都会强制要求预先确定好数据表的列。而且在更改数据模式之前,用户需要仔细考虑数据库的数据定义语言(DDL)和数据建模语言(DML)。

虽然关系型数据库和文档数据库都使用到了DDL和DML的概念,但是在关系型数据库中,建立DDL和DML是至关重要的。相反,由于MongoDB具有可扩展的数据模式,因此它不像MySQL那样关注数据的结构。当然,这种“不灵活性”反而是MySQL的最大优势之一,毕竟它能够保持数据在结构上的整洁与一致。 

资料来源:https://dev.mysql.com/

每个MongoDB数据库都包含了以“顺次存放”的方式填充的文档集合。由于这些文档本身包含了各种字段和信息类型,因此它能够存储的内容和数据大小是极其丰富的。然而在MySQL中,由于数据模式受到了极大的约束,因此数据表中的每一行都需要包含相同的特征列,而这会使得管理大量数据库变得相当麻烦。可见,MySQL不能够像MongoDB那样可以轻松地处理大型且复杂的数据库。换句话说,在处理大量且复杂的数据集时,文档数据库MongoDB会比关系型数据库MySQL更具有优势。

性能和速度

通常,MongoDB能够比MySQL更快地接受更多数量的结构化、以及非结构化的数据。不过,如果某企业日常处理的数据体量和变化频率都不大的话,那么速度就不一定是其需要关注的方面。也就是说,诸如业务或项目数据的一致性、可靠性需求,都会优先于速度被考虑到。

MySQL则是确保数据隐私和完整性的成熟方案。在其显式架构中,MySQL通过数据表的形式对数据类型进行系统化,进而创建可靠的数据库结构,且便于用户对表里的数据进行便捷地查询与搜索。不过,MySQL显然不是非结构化数据的绝佳选择。在使用MySQL时,用户需要事先准备好数据结构。这会最小化后期产生的技术债务,因此这便是MySQL的最大的优势。不过该架构也就限制了它对于复杂数据的灵活处置能力。

相反,由于MongoDB能够为非结构化数据提供灵活、快速的性能,当用户难以预先设计好数据模式时,文档数据存储将是一个很好的选择。当然,如果数据种类过于丰富,用户很难在数据属性上创建出对应的索引,那么他们就需要频繁地优化数据模式。而此举则可能产生数据的不一致性。

安全性

MySQL采用的是基于特权的安全模型。该模型既能够提供基本的身份验证,又可以在特定的数据库上实施用户特权的管控。在数据库与服务器之间传输数据的过程中,MySQL必须采用安全套接字层(SSL,一种安全协议)的方式,来加密连接。

而MongoDB的安全性主要包括:基于角色的访问控制、身份验证、授权和审核等。当然,如果需要加密,它也可以实施安全传输层(TLS)和SSL协议。

因此就安全性而言,常用业务应用更趋向于使用成熟的MySQL来实现。

ACID:原子性、一致性、隔离性和持续性

众所周知,ACID是确保数据有效性的一组数据库事务属性。MySQL的事务一直都能符合ACID。而追求速度和高可用性的MongoDB,在ACID方面并不占优。直到2018年,MongoDB才在多文档事务中满足ACID。不过,该选项在默认情况下是关闭的。

查询

当需要从数据库表或表的组合中请求信息时,MySQL会使用最流行、最广泛的查询语言—SQL,通过DDL和DML与数据库进行通信。

而MongoDB使用的是非结构化的查询语言。为了能够从JSON文档数据库处请求并获取数据或信息,用户需要事先指定与结果应匹配的文档属性。换句话说,在对MongoDB数据库执行查询操作之前,用户需要用到db.collection.find()。MongoDB支持诸如:Python、Java、C#、Perl、PHP、Ruby和JavaScript等可用于构建查询的语言。通过诸如:$and、$or、$type、以及$eq等查询操作符,用户可以在复合查询中,为文档集合中的各个字段建立特定的查询条件,并启用查询过滤器来过滤文件。如下图所示,在定义了条件之后,它会标识出符合选择条件的信息或记录,并对其进行更新、读取或删除。

资料来源:https://docs.mongodb.com/guides/

在使用MySQL时,用户可以通过JOIN操作(如,内部、外部、左侧、右侧和交叉),从两个或多个数据库表中检索数据。也就是说,仅单个SQL语句便可获取多个表中的关联数据。而MongoDB并不会执行JOIN及其等效操作。

该如何选择MongoDB与MySQL

作为文档数据库,由于MongoDB并不限制用户存储数据的体量和类型,因此适合大数据的应用环境。这对基于云的服务将特别有利。而得益于MongoDB的水平可扩展能力,以及与云服务的敏捷性结合,它不但能够减少开发者的工作量,简化业务与项目的扩展流程,还能够提供高可用性和数据的快速恢复。

不过,MongoDB在数据的可靠性、一致性、以及安全性等方面,不如MySQL。此外,当应用程序需要提供多行事务(如,会计和银行系统)时,以MySQL为首的关系型数据库提供了高事务处理率(high transaction rate)。实际上,与MySQL专注于提供事务的ACID和安全性不同的是,MongoDB更专注于提供高插入率(high insert rate)。

因此,我强烈建议您将MySQL用于具有固定数据模式、且不打算在数据的多样性方面进行扩展的企业或项目。毕竟,在确保数据完整性和可靠性的同时,MySQL不但方便被维护,而且成本较低。

相反,MongoDB是那些正在成长、但数据架构并不固定的业务或项目的最合适选择。由于它允许开发者在无需任何结构的情况下,自由地更新、检索和存储文档,因此它通常适用于需要内容管理,物联网(IoT)处理,以及实时分析等项目中。

小结

综上所述,MySQL是一个开源的关系型数据库。其数据的组织形式为数据表,开发者可以将目标数据与数据库的其他部分相关联。MongoDB则是开源的文档数据库。它既不关联任何数据记录,又无固定的数据模式。同时,它提供高插入能力、动态性、以及灵活的数据库。

如前所述,由于MongoDB比MySQL更能够处理大量的数据,因此更适合那些基于云端的服务、频繁增长和变更的应用、以及大数据的环境。相反,MySQL以其固定且结构化的数据模式,以及符合ACID的事务特征,为数据提供了更高的一致性、可靠性和安全性。总之,MongoDB和MySQL都很优秀,具体如何选择,完全取决于您的具体应用需求和系统特征。

原文标题:MongoDB Vs. MySQL: When to Use?,作者: Mariana Berga

【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】

责任编辑:华轩 来源: 51CTO
相关推荐

2023-11-03 09:05:53

2011-08-23 17:45:54

MySQL丢失root密码

2010-06-09 10:09:39

MySQL 数据库导入

2021-10-03 15:00:44

数据库mysql单机

2012-04-28 10:07:43

数据库数据库设计

2013-03-20 11:33:31

2013-03-20 13:25:53

数据库数据库设计

2013-03-20 11:25:47

数据库数据库设计

2013-03-20 13:35:12

数据库数据库设计

2011-07-26 13:55:01

MongoDB备份与恢复

2013-03-20 13:16:15

2017-11-23 15:06:14

前端数据库开发

2011-07-28 17:02:59

MYSQL数据库跨表更新数据并合

2011-08-23 15:16:54

OracleMySQL

2019-10-15 14:53:23

MongoDBMySQL数据库

2011-03-01 14:04:30

2011-05-18 13:16:21

MySQL数据库锁定

2011-03-21 17:00:23

MySQL数据库

2009-02-02 13:16:23

修复数据表MySQL

2010-06-01 12:51:23

MySQL数据库
点赞
收藏

51CTO技术栈公众号