当前位置: 首页 > 科技观察

MongoDB与MySQL:如何选择

时间:2023-03-14 16:35:20 科技观察

MongoDB和MySQL分别是领先的开源NoSQL和关系数据库。哪个最适合您的应用?在1990年代的互联网泡沫期间,一种常见的Web应用程序软件堆栈是LAMP,它最初代表Linux(OS)、Apache(Web服务器)、MySQL(关系数据库)和PHP(服务器编程语言)。MySQL是首选数据库,主要是因为它是免费和开源的,并且具有良好的读取性能,使其成为从数据库动态生成网站的“Web2.0”应用程序的理想选择。之后,代表MongoDB(文档数据库)、Express(网络服务器)、AngularJS(前端框架)和Node.js(后端JavaScript运行时)的MEAN堆栈开始流行。除了其他原因,MEAN堆栈很有吸引力,因为您唯一需要了解的语言是JavaScript。与等效的LAMP堆栈相比,它还需要更少的RAM。什么是MySQL/MariaDB?MySQLAB的MontyWidenius和DavidAxmark最初于1994年开始开发MySQL。产品名称中的“My”是指Widenius的女儿,而不是英文单词“my”。MySQL旨在与mSQL(又名Mini)兼容。SQL),并添加了SQL查询层和开源许可证(实际上是双重专有和GPL许可证)。MySQL的公开发布于1996年底开始,并且每年或每两年一次。MySQL是目前最流行的关系型数据库。SunMicrosystems于2008年以10亿美元收购了MySQLAB,Oracle于2010年收购了Sun。在对Oracle收购MySQL的广泛关注中,Widenius在Oracle收购之前将MySQL5.5合并到MariaDB中。MariaDB努力保持与Oracle的MySQL版本的兼容性。与更强大的商业关系数据库(如Oracle数据库、IBMDB/2和MicrosoftSQLServer)相比,MySQL最初是一个相当低端的关系数据库,尽管它作为动态网站的后备存储已经足够好了。多年来,它添加了您期望从关系数据库获得的大部分功能,包括事务、引用完整性约束、存储过程、游标、全文索引和搜索、地理索引和搜索以及集群。尽管MySQL现在支持“大数据库”功能,例如主从部署、与Memcached一起使用以及水平分片,但它仍然通常用于中小型部署。将MySQL扩展到多个slave可以提高读性能,但是只有master可以接受写请求。AWS提供两种形式的MySQL即服务,即AmazonRDS和AmazonAurora。后者具有更高的性能,可以处理数TB的数据,更新副本的延迟更低,并且可以直接与Oracle数据库和SQLServer竞争。什么是MongoDB?MongoDB是一个高度可扩展的操作文档数据库,提供开源版本和商业企业版,可以在本地运行或作为托管云服务运行。托管云服务称为MongoDBAtlas。MongoDB无疑是NoSQL数据库中最受欢迎的。其文档数据模型为开发人员提供了极大的灵活性,而其分布式架构则提供了极大的可扩展性。因此,MongoDB通常被选择用于必须管理大量数据、受益于水平可扩展性以及处理不适合关系模型的数据结构的应用程序。MongoDB是一个基于文档的存储,上面有一个基于图形的存储。MongoDB实际上并不存储JSON:它存储BSON(二进制JSON),它扩展了JSON表示(字符串)以包括其他类型,例如int、long、date、float、decimal128和地理空间坐标。MongoDB可以根据数据类型生成正确的索引类型,从而在单个数据副本上生成多模式图、地理空间、B树和全文索引。MongoDB使您能够在任何文档字段上创建索引。MongoDB4具有多文档事务,这意味着即使您必须标准化数据设计,您仍然可以获得ACID属性。默认情况下,MongoDB使用动态模式,有时称为无模式。单个集合中的文档不需要具有相同的字段集,并且字段的数据类型在集合中的不同文档之间可以不同。您可以随时使用动态模式更改文档结构。但是,可以使用模式治理。从MongoDB3.6开始,MongoDB支持JSON模式验证,您可以在验证器表达式中打开它。LAMP和MEAN栈LAMP和MEAN栈有很多变体。例如,您可以在Windows(WAMP)或MacOS(MAMP)而不是Linux操作系统上运行。您可以在Windows上运行IIS(WIMP)而不是ApacheWeb服务器。您可以在LAMP堆栈中运行PostgreSQL或SQLServer而不是MySQL关系数据库。如果您需要全球分布,您可以运行CockroachDB或GoogleCloudSpanner。可以使用Perl或Python代替PHP语言。如果您使用Java或C#进行编码,则需要考虑一个单独的堆栈系列。您可以运行Couchbase或AzureCosmosDB以实现更好的全球分布,而不是MEAN堆栈中的MongoDB文档数据库。可以使用十几个Node.jsWeb服务器框架中的任何一个来代替Express。除了AngularJS前端框架,您还可以运行Angular2或React。如何为您的应用程序选择数据库选择数据库时要问的最重要的问题是:随着应用程序的成熟,您希望存储多少数据?您希望在峰值负载下同时处理多少用户?您的应用程序需要什么可用性、可伸缩性、延迟、吞吐量和数据一致性?您的数据库架构多久更改一次?您的用户群的地理分布是什么?您的数据的自然“形状”是什么?您的应用程序需要联机事务处理(OLTP)、分析查询(OLAP)或两者兼而有之?您期望生产中的读写比例是多少?您需要地理查询和/或全文查询吗?您首选的编程语言是什么?你有预算吗?如果是这样,它会涵盖许可和支持合同吗?其中一些问题往往会缩小数据库的选择范围,但我们有比布置LAMP堆栈时更多的选择。如果您要构建的应用程序必须在99.999%的时间内为全世界的用户提供高度一致的应用程序,那么只有少数几个数据库适合您。如果你的应用程序会在一个国家工作日早上9点到下午6点使用,并且可以容忍最终一致性,那么几乎任何数据库都可以工作,尽管有些数据库对开发人员来说更难,而对你来说操作员更容易,有些数据库可能提供更好的主要用例的性能。虽然LAMP和MEAN堆栈曾经是Web应用程序的良好解决方案,但现在都不是最佳选择。您不应盲目采用任何一种,而应仔细考虑您的用例并找到一种可在可预见的未来为您的应用程序服务的架构。SQL还是NoSQL?您什么时候需要一个关系数据库(例如MySQL)用于新应用程序?除了对标准SQL的明显支持之外,关系数据库本质上将数据强制转换为具有一致强类型字段的表格模式,只要您利用规范化就可以帮助您避免数据重复。如果需要避免丢失数据,可以在创建或修改表时声明NOTNULL字段。如果您需要开放地理空间联盟定义的地理查询,大多数关系数据库将提供可靠的实现。而且,如果你需要全文搜索,大多数关系型数据库都允许你在文本字段上定义倒排索引,FULLTEXT在MySQL中被称为索引。另一方面,如果您偶尔也需要自由格式的文档,MySQL和许多其他关系数据库也支持RFC7159定义的JSON数据。如果您还想使用XML文档和XPath或XSLT,大多数关系数据库都提供这种能力。什么时候需要像MongoDB这样的文档数据库?如果您的主要用例需要允许自由格式数据、在文档之间更改类型的字段、随时间更改的模式或嵌套文档,则NoSQL数据库将符合要求。此外,如果您的应用程序是用JavaScript编写的,那么文档数据库的JSON格式将是一个自然的选择。作者:MartinHeller是InfoWorld的特约编辑和审稿人。从1986年到2010年,他担任Web和Windows编程顾问,开发数据库、软件和网站。最近,他担任AlphaSoftware的技术和教育副总裁以及Tubifi的董事长兼首席执行官。