第五十四期:MongoDB与MySQL:如何选择

MongoDB和MySQL分别是领先的开源NoSQL和关系数据库。哪个最适合您的应用程序?

作者:XEyes行走的CODE来源

 

MongoDB和MySQL分别是领先的开源NoSQL和关系数据库。哪个最适合您的应用程序?

在1990年代的互联网泡沫时期,用于Web应用程序的一种通用软件堆栈是LAMP,它最初代表Linux(OS),Apache(Web服务器),MySQL(关系数据库)和PHP(服务器编程语言)。MySQL是首选的数据库,主要是因为它是免费的开源代码,并且具有良好的读取性能,非常适合从数据库动态生成网站的“ Web 2.0”应用程序。

之后,代表MongoDB(文档数据库),Express(Web服务器),AngularJS(前端框架)和Node.js(后端JavaScript运行时)的MEAN堆栈开始流行。除其他原因外,MEAN堆栈很有吸引力,因为您需要了解的唯一语言是JavaScript。与等效的LAMP堆栈相比,它还需要更少的RAM。

什么是MySQL / MariaDB?

MySQL AB的Monty Widenius和David Axmark最初于1994年开始开发MySQL。产品名称中的“ My”是指Widenius的女儿,而不是英语单词“ my”。MySQL旨在与mSQL(又名Mini)兼容。 SQL),并添加了SQL查询层和开放源代码许可(实际上是专有和GPL双重许可)。MySQL的公共发行版于1996年底开始,并且每年或每两年持续发行一次。MySQL是当前最受欢迎的关系数据库。

Sun Microsystems于2008年以10亿美元的价格收购了MySQL AB,Oracle于2010年收购了Sun。在Oracle收购MySQL的广泛关注中,Widenius在收购Oracle之前就将MySQL 5.5合并到了MariaDB中。MariaDB努力维护与Oracle MySQL版本的兼容性。

与功能更强大的商业关系数据库(例如Oracle数据库,IBM DB / 2和Microsoft SQL Server)相比,MySQL最初是一个相当低端的关系数据库,尽管它足以成为动态网站的后备存储。多年来,它增加了您希望从关系数据库获得的大多数功能,包括事务,参照完整性约束,存储过程,游标,全文索引和搜索,地理索引和搜索以及群集。

尽管MySQL现在支持“大数据库”功能,例如主从部署,与Memcached一起使用以及水平分片,但它仍通常用于中小型部署。将MySQL扩展到多个从属服务器可以提高读取性能,但是只有主服务器才能接受写请求。

AWS提供了两种形式的MySQL即服务,即Amazon RDS和Amazon Aurora。后者具有更高的性能,可以处理TB级的数据,更新副本的延迟时间更短,并且可以直接与Oracle数据库和SQL Server竞争。

什么是MongoDB?

MongoDB是高度可伸缩的操作文档数据库,可在开源版本和商业企业版本中使用,它可以在本地运行或作为托管云服务运行。托管云服务称为MongoDB Atlas。

MongoDB无疑是NoSQL数据库中最受欢迎的数据库。它的文档数据模型为开发人员提供了极大的灵活性,而其分布式体系结构则提供了很好的可伸缩性。因此,通常选择MongoDB用于必须管理大量数据,得益于水平可伸缩性并处理不适合关系模型的数据结构的应用程序。

MongoDB是一个基于文档的存储,在其之上还具有一个基于图形的存储。MongoDB实际上并不存储JSON:它存储BSON(二进制JSON),该扩展了JSON表示(字符串)以包括其他类型,例如int,long,date,浮点,decimal128和地理空间坐标。

MongoDB可以使用数据的类型生成正确的索引类型,从而在数据的单个副本上生成多模式图形,地理空间,B树和全文本索引。MongoDB使您可以在任何文档字段上创建索引。MongoDB 4具有多文档事务,这意味着即使必须标准化数据设计,您仍然可以获得ACID属性。

默认情况下,MongoDB使用动态模式,有时称为无模式。单个集合中的文档不需要具有相同的字段集,并且字段的数据类型可以在集合中的不同文档之间有所不同。您可以随时使用动态模式更改文档结构。

但是,可以使用架构治理。从MongoDB 3.6开始,MongoDB支持JSON模式验证,您可以在验证器表达式中将其打开。

LAMP和MEAN堆栈

在LAMP和MEAN堆栈上存在很多变化。例如,您可以在Windows(WAMP)或MacOS(MAMP)上运行而不是Linux OS。您可以运行IIS(WIMP),而不是Windows上的Apache Web服务器。

您可以运行PostgreSQL或SQL Server,而不是LAMP堆栈中的MySQL关系数据库。如果您需要全球分布,则可以运行CockroachDB或Google Cloud Spanner。可以使用Perl或Python代替PHP语言。如果要使用Java或C#进行编码,则需要考虑单独的堆栈系列。

您可以运行Couchbase或Azure Cosmos DB以获得更好的全局分布,而不是MEAN堆栈中的MongoDB文档数据库。可以使用十二个Node.js Web服务器框架中的任何一个来代替Express 。除了AngularJS前端框架,您还可以运行Angular 2或React。

如何为您的应用程序选择数据库

选择数据库时要问的最重要的问题是:

  • 您希望在应用程序成熟时存储多少数据?
  • 您希望在高峰负载下同时处理多少个用户?
  • 您的应用程序需要什么可用性,可伸缩性,延迟,吞吐量和数据一致性?
  • 您的数据库架构多久更改一次?
  • 您的用户群体的地理分布是什么?
  • 您的数据的自然“形状”是什么?
  • 您的应用程序需要在线事务处理(OLTP),分析查询(OLAP)还是同时需要两者?
  • 您期望生产中的读写比例是多少?
  • 您需要地理查询和/或全文查询吗?
  • 您首选的编程语言是什么?
  • 你有预算吗?如果是这样,它将涵盖许可和支持合同吗?

这些问题中的几个会趋于缩小数据库的选择范围,但是与制定LAMP堆栈时相比,我们有更多选择。如果您要构建一个应用程序,并且该应用程序必须在99.999%的时间内对全世界的用户都具有高度的一致性,那么只有少数几个数据库适合您。如果您的应用程序将在工作日的上午9点至下午6点在一个国家/地区使用,并且可以容忍最终的一致性,那么几乎所有数据库都可以使用,尽管某些数据库对于开发人员和操作员而言更容易,而某些数据库则可以为您的主要使用场景提供更好的性能。

虽然LAMP和MEAN堆栈一次是Web应用程序的良好解决方案,但现在都不是最佳选择。而不是盲目采用任何一种,您应该仔细考虑用例,并找到一种可在可预见的将来为您的应用程序服务的体系结构。

SQL还是NoSQL?

您什么时候需要关系数据库(例如MySQL)用于新应用程序?除了对标准SQL的明显支持外,关系数据库本身将数据强制为具有一致的强类型字段的表格模式,并且只要您利用规范化就可以帮助您避免数据重复。

如果需要避免丢失数据,则可以NOT NULL在创建或修改表时声明字段。如果您需要由开放地理空间联盟定义的地理查询,则大多数关系数据库都将提供可靠的实现。而且,如果您需要全文搜索,则大多数关系数据库都允许您在文本字段上定义倒排列表索引,FULLTEXT在MySQL中称为索引。

另一方面,如果您还需要偶尔的自由格式文档,则MySQL和许多其他关系数据库也支持RFC 7159定义的JSON数据。如果您还想使用XML文档和XPath或XSLT,则大多数关系数据库都可以提供这种能力。

您何时需要像MongoDB这样的文档数据库?如果您的主要用例需要允许使用自由格式的数据,在文档之间更改类型的字段,随时间变化的架构或嵌套的文档,则NoSQL数据库将满足要求。另外,如果您的应用程序是用JavaScript编写的,那么文档数据库的JSON格式将很自然。

阅读目录(置顶)(长期更新计算机领域知识)

阅读目录(置顶)(长期更新计算机领域知识)

阅读目录(置顶)(长期科技领域知识)

歌谣带你看java面试题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/424548.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态规划——矩阵中的最短路径长度

文章出处:极客时间《数据结构和算法之美》-作者:王争。该系列文章是本人的学习笔记。 题目 假设我们有一个 n 乘以 n 的矩阵 w[n][n]。矩阵存储的都是正整数。棋子起始位置在左上角,终止位置在右下角。我们将棋子从左上角移动到右下角。每次…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第19篇]Shamir密钥交换场景

这是一系列博客文章中最新的一篇,该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 Shamir密钥交换场景是一个被Adi Shamir提出的算法.算法允许多方分割一个密码,例如一个密钥.当足够多的秘密结…

第五十五期:MongoDB数据库误删后的恢复

如果部署的是 MongoDB 复制集,这时还有一线希望,可以通过 oplog 来尽可能的恢复数据;MongoDB 复制集的每一条修改操作都会记录一条 oplog;如果对 MongoDB 做了全量备份 增量备份,那么可以通过备份集及来恢复数据。 作者&#xf…

037-PHP如何返回闭包函数实例

<?php /*: 如何返回闭包函数实例*/# 直接调用将不会输出$txt的内容function demo(){$txt 我爱PHP;$func function () use ($txt) {echo $txt;};# 这里不再直接调用&#xff0c;而且是把实例返回return $func; # 区别于直接写 $func;}# 测试一下 $res demo(); // 函数返…

动态规划——莱文斯坦距离

文章出处&#xff1a;极客时间《数据结构和算法之美》-作者&#xff1a;王争。该系列文章是本人的学习笔记。 莱文斯坦距离 在搜索引擎中会有搜索词纠错的功能。这个功能背后的原理是编辑距离。 编辑距离 编辑距离是量化两个词之间的相似度。 编辑距离是指将一个字符串变为…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第18篇]画一个/描述ECB,CBC,CTR模式的操作

操作模式:块密码的安全性依赖于加解密一个固定长度的明文块.当加密或者解密消息的时候,块是被需要的.我们使用一种操作模式将明文的多个块链接在一起.我们会知道,这种链接在一起的方法是十分重要. 电子密码本(ECB)模式:加密,解密. ECB模式是最直接的方法.明文被分割成m块.每一…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第20篇]Merkle-Damgaard hash函数如何构造

这里讲的是MD变换,MD变换的全称为Merkle-Damgaard变换.我们平时接触的hash函数都是先构造出一个防碰撞的压缩函数.然后先证明这个小的,固定长度的压缩函数是安全的,然后再用它构造一个任意长度的哈希算法.虽然存在很多其它的构造方法,MD是迄今为止最常用的(至少是被用到最多的)…

第五十六期:IPv6只是增加了地址数量?其实真相并没有那么简单!

究竟什么是IPv6?它到底是干啥用的?IPv6的全称是Internet Protocol version 6。其中&#xff0c;Internet Protocol译为“互联网协议”。所以&#xff0c;IPv6就是互联网协议第6版。 作者&#xff1a;小枣君 10月20日&#xff0c;在乌镇举办的第六届世界互联网大会上&#x…

spring学习(10):创建项目(自动装配)

首先创建项目 pom.xml的配置文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://mav…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第21篇]CRT算法如何提高RSA的性能?

CRT加速RSA&#xff1a;https://www.di-mgt.com.au/crt_rsa.html 转载链接&#xff1a;https://www.cnblogs.com/zhuowangy2k/p/12245513.html

动态规划——最长递增子序列

题目 我们有一个数字序列包含 n 个不同的数字&#xff0c;如何求出这个序列中的最长递增子序列长度&#xff1f;比如 2, 9, 3, 6, 5, 1, 7 这样一组数字序列&#xff0c;它的最长递增子序列就是 2, 3, 5, 7&#xff0c;所以最长递增子序列的长度是 4。 回溯法 数组长度为n&a…

spring学习(11):使用配置类

CompactDisc类 package soundSystem;import org.springframework.stereotype.Component;Component public class CompactDisc {public CompactDisc() {super();System.out.println("compactdisc无参构造方法");}public void play(){System.out.println("正在播…

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第22篇]如何用蒙哥马利算法表示一个数字和多个相乘的数字

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 安全和效率 密码学的目标是设计高度安全的密码学协议,但是同时这些协议也应该被有效率的实现.这样就可以一…

动态规划——双11既可以薅羊毛还能花钱最少

淘宝的“双十一”购物节有各种促销活动&#xff0c;比如“满 200 元减 50 元”。假设你的购物车中有 n 个&#xff08;n>100&#xff09;想买的商品&#xff0c;希望从里面选几个&#xff0c;在凑够满减条件的前提下&#xff0c;让选出来的商品价格总和最大程度地接近满减条…

spring学习(12):使用junit4进行单元测试

pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第23篇]写一个实现蒙哥马利算法的C程序

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 这次博客我将通过对蒙哥马利算法的一个实际的实现&#xff0c;来补充我们上周蒙哥马利算法的理论方面。这个…

spring学习(13):使用junit4进行单元测试续

加入spring test.jar包 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven…

《java程序员修炼之道》pdf书籍

链接&#xff1a;https://pan.baidu.com/s/1bbsTPCpUNI9klh40-8Be7w 提取码&#xff1a;pc57 转载于:https://www.cnblogs.com/pyweb/p/10995145.html

[密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第24篇]描述一个二进制m组的滑动窗口指数算法

这是一系列博客文章中最新的一篇&#xff0c;该文章列举了“每个博士生在做密码学时应该知道的52件事”:一系列问题的汇编是为了让博士生们在第一年结束时知道些什么。 二进制算法 二进制模幂算法和传统的求幂的二次方方法非常像。实际上&#xff0c;唯一的不同就是我们把N表示…

第五十八期:从0到1 手把手教你建一个区块链

近期的区块链重回热点&#xff0c;如果你想深入了解区块链&#xff0c;那就来看一下本文&#xff0c;手把手教你构建一个自己的区块链。 作者&#xff1a;Captain编译 近期的区块链重回热点&#xff0c;如果你想深入了解区块链&#xff0c;那就来看一下本文&#xff0c;手把手…