mongodb和mysql的区别

对于需要关系数据库的全球组织来说,MySQL已经成为一种便宜的选择。但是,随着近年来数据种类和数量的增加,已经出现了非关系数据库(如MongoDB)来满足我们的流动数据的新需求。

谁使用这些数据库?

MySQL:MySQL自1995年以来就已经成熟,并且吸引了大量的追随者。一些使用MySQL的组织包括Pinterest,Twitter,YouTube,Netflix,Spotify,美国海军,NASA,沃尔玛和Paypal。

MongoDB:MongoDB于2009年发布,并被许多组织使用,包括Klout,Citrix,Twitter,T-Mobile,Zendesk,Sony,Hootsuite,SurveyMonkey,MuleSoft,Foursquare和InVision。

那么数据库结构呢?

MySQL:MySQL将数据存储在表中,并使用结构化查询语言(SQL)访问数据。MySQL使用模式定义数据库结构,要求表中的所有行都具有相同的结构,并且值由特定的数据类型表示。

MongoDB:在MongoDB中,数据存储在类似JSON的文档中,该文档可以具有不同的结构。为了提高查询速度,MongoDB可以将相关数据存储在一起,可以使用MongoDB查询语言进行访问。MongoDB是无架构的,允许您创建文档而不必先定义文档的结构。通过添加或删除字段,可以轻松更改这些文档。

在MongoDB中,文档可以具有自己独特的结构。可以随时添加新字段,并且可以包含任何类型的值。这种类型的功能将需要重组关系数据库。

尽管密钥对于一个文档必须是唯一的,但是允许您使用与其他文档相同的密钥。

使用MongoDB数据模型,您可以在数据库中表示层次结构关系,数据数组和其他复杂结构。在某些情况下,MongoDB的性能优于MySQL,因为MongoDB不使用联接来连接数据,从而提高了性能。

是否需要索引?

MySQL和MongoDB都使用索引来允许它们快速查找数据。

MySQL:对于MySQL,如果未定义索引,则数据库引擎必须扫描整个表以查找所有相关行。

MongoDB:在MongoDB中,如果未找到索引,则必须扫描集合中的每个文档以选择与查询语句匹配的文档。

他们的查询有何不同?

从客户表中选择记录:

MySQL的: 

SELECT * 
FROM customer

MongoDB: 

db.customer.find()

将记录插入到客户表中:

MySQL的: 

INSERT INTO customer (cust_id, branch, status) 
VALUES ('appl01', 'main', 'A')

MongoDB: 

db.customer.insert({
    cust_id: 'appl01',
    branch: 'main',
    status: 'A'
})

更新客户表中的记录:

MySQL的: 

UPDATE customer 
SET branch = 'main' 
WHERE custage > 2

MongoDB:  

db.customer.update({
      custage: { $gt: 2 }
  }, 
  {
      $set: { branch:'main' }
  }, 
  {
      multi: true
})

MySQL可能会受到SQL注入攻击,使其易受攻击。由于MongoDB使用对象查询(将文档传递到该对象的位置来解释要查询的内容),因此由于MongoDB没有可解析的语言,因此降低了遭受攻击的风险。

这些数据库在哪里(以及如何)部署?

MySQL:MySQL用C和C ++编写,并具有以下系统的二进制文件:Microsoft Windows,OS X,Linux,AIX,BSDi,FreeBSD,HP-UX,IRIX,NetBSD等。

MongoDB:MongoDB用C ++,C和JavaScript编写,并且具有以下系统的二进制文件:Linux,OS X,Solaris和Windows。

哪些类型的备份/群集可用?

MySQL:MySQL支持master – slave复制和master – master复制(从MySQL 5.7.6及更高版本开始)。多源复制使您可以从多个主数据库并行复制。

MongoDB:MongoDB支持内置的复制,分片和自动选择。使用自动选择,您可以将辅助数据库设置为在主数据库发生故障时自动接管。分片允许水平缩放,这在MySQL中很难实现。

MongoDB使用副本集来创建数据的多个副本。副本集的每个成员在过程中的任何时候都可以扮演主要或次要角色。默认情况下,对主副本执行读写操作,然后将其复制到辅助副本。

谁来维护?

MySQL:MySQL由芬兰/瑞典公司MySQL AB创立,该公司由David Axmark,Allan Larsson和Michael“ Monty” Widenius创立。1995年,发布了MySQL的第一个版本。最初的版本是为个人使用而设计的,但后来演变为企业级数据库。在2008年,Sun Microsystems收购了MySQL AB。2009年,甲骨文收购了Sun Microsystems,并将MySQL作为交易的一部分。

MySQL目前归Oracle Corporation所有。

MongoDB:10gen从2007年开始开发MongoDB,其名称来源于“巨大”一词。它于2009年发布,现已成为流行的NoSQL数据库。10gen后来改名为MongoDB,Inc.,并继续进行软件开发以及企业解决方案的销售。

谁提供支持?

MySQL:MySQL 在三个级别上提供Oracle Lifetime支持:1-5年的Premier版本,6-8年的扩展版本以及希望使用同一版本9年以上的人员的Sustain。每个级别都提供24 x 7的支持,包括知识库,维护版本,错误修复,补丁程序和更新。

MongoDB:MongoDB提供了“超越中断/修复范围”的企业级支持。这为您提供24 x 7全天候支持以及扩展的生命周期支持附加组件,使您可以根据自己的进度灵活地升级到较新版本。对MongoDB的支持使您可以无限制地访问支持,安全修补程序,更新等。

谁提供持续的发展?

MySQL:正在进行的开发由Oracle Corporation完成。

MongoDB:正在进行的开发由MongoDB,Inc.完成。

谁维护文档?

MySQL:MySQL文档由Oracle Corporation维护,可以在dev.mysql.com/doc中找到

MongoDB:MongoDB文档由MongoDB,Inc.维护,可以在https://docs.MongoDB.com/上找到。

有活跃的社区吗?

MySQL:MySQL数据库由Oracle Corporation拥有和维护。因此,他们在MySQL网站上提供了开发人员专区。可以在https://forums.mysql.com/找到该资源。

其他信息也可以在以下位置找到:

MySQL Wiki

Oracle MySQL事件

MySQL事件

MySQL用户组列表

MongoDB:“与MongoDB相比,MySQL优于NoSQL的一个优势是MySQL社区要比NoSQL好得多。这主要是因为NoSQL是相对较新的,而MySQL已经存在了几年。” analyticbridge.com的Jenny Richards说。

可以在https://www.MongoDB.com/community上找到MongoDB社区。该页面提供了各种事件,网络研讨会,用户组和MongoDB大学。

哪个数据库适合您的业务?

在MySQL和MongoDB之间进行选择时,需要考虑多种因素:

MySQL:像MySQL这样的关系数据库有很多用例。需要多行事务的任何类型的应用程序(例如记帐系统)都将更适合于关系数据库。MongoDB不能轻松替代为关系数据库构建的旧系统。

MongoDB:另一方面,MongoDB有很多适合的用例。其中一些包括实时分析,内容管理,物联网,移动和其他类型的新应用程序,它们可以利用MongoDB提供的功能。

可以选择使用MongoDB的一些方案包括:

没有明确的架构定义-在许多情况下,当使用没有明确的架构定义的数据库时,MongoDB可能是一个不错的选择。

在以下情况下:

  • 在设计阶段,您无法为数据库定义架构。
  • 您会发现您正在对数据库架构进行非规范化。在MongoDB中,文档可用于存储非结构化数据,并使其更易于更新和检索。
  • 您的数据库正在增长,但是您的架构不稳定。在MySQL中,如果表超过10 GB,则该表可能会降级,MongoDB没有此问题。

当向关系数据库(如MySQL)添加新列时,它会锁定整个数据库并导致性能问题。使用MongoDB,由于它没有架构,因此您可以添加新字段,并且不会影响现有行。

写入负载很高-对于与读取相比写入很多的环境,MongoDB是一个不错的选择。MongoDB的编写具有很高的插入率,而不必像MySQL那样担心事务安全性。

没有数据库管理员-如果您没有数据库管理员,则可能值得考虑MongoDB。

您将失去与其他数据库的连接-如果您的环境与其他服务器之间没有可靠的连接,则MongoDB的高可用性可能会有所帮助。

MySQL与MongoDB.png 

MySQLMongoDB都有其优点和缺点。如果您的数据需要多行事务,或者您必须支持旧版应用程序,那么关系数据库可能是您组织的正确选择。但是,如果您需要一个更灵活,无模式的解决方案来处理非结构化数据,那么MongoDB是值得考虑的。

本文翻译自https://blog.panoply.io/mongodb-and-mysql

Redis持久化数据到磁盘上
如何使用跳板机访问远程服务器