为什么NoSQL比SQL快?


48

最近有人问我:

为什么NoSQL比SQL快?

我不同意这个问题的前提...对于我个人而言这只是胡说八道。通过使用NoSQL而不是SQL,我看不到任何性能提升。也许SQL优于NoSQL,是的,但不是那样。

我是否缺少有关NoSQL的内容?


3
如果您看不到性能提升,那就是您的意思。事实是,大多数NoSQL解决方案都放弃了关系数据库的一个(或多个)ACID属性,因此它们做得很少。
Oded 2012年

1
有些工作流程(和数据结构)无法轻松映射到启用了ACID的传统关系数据库。对于这些,使用NoSQL数据库可以看到巨大的性能提升。但是,如果仅采用现有的(设计良好的)SQL DB并将其放入NoSQL数据库,则性能肯定会受到影响。
约阿希姆·绍尔

1
答案是:建立速度是否更快?而且更快吗?开发时间?看时间?写时间?哪种类型的写?我们将其与什么进行比较?多表查询?加入?
罗尔夫(Rolf)

Answers:


65

周围有许多NoSQL解决方案,每个解决方案都有其优点和缺点,因此,必须认真考虑以下内容。

但是从本质上讲,许多NoSQL数据库所做的就是依靠非规范化并尝试针对非规范化情况进行优化。例如,假设您正在阅读博客文章及其在面向文档的数据库中的评论。通常,评论会与帖子本身一起保存。这意味着将它们一起存储在一起的速度更快,因为它们存储在同一位置,您不必执行联接。

当然,您可以在SQL中执行相同的操作,当需要性能时,反规范化是一种常见的做法。只是从一开始就设计了许多NoSQL解决方案,以使其始终以这种方式使用。然后您将获得通常的权衡:例如,在上面的示例中添加注释会比较慢,因为您必须将整个文档保存在一起。并且,一旦进行了非规范化,就必须注意在应用程序中保持数据完整性。

而且,在许多NoSQL解决方案中,不可能进行任意联接,因此无法进行任意查询。某些数据库(例如CouchDB)要求您先考虑所需的查询,然后在数据库中进行准备。

总而言之,它归结为期望使用非规范化的架构并针对这种情况优化读取,这对于关系不是很强并且需要比写入更多的读取的数据非常有用。


4
顺便说一下,这可以通过简单的实例化视图或缓存层来实现,同时仍然受益于所有SQL优点。正确建模的任何事物都是关系性的,逻辑数据重复不是解决方案(mat。view是重复的,但不是逻辑重复,因为它只是其他事物的图像)。
Morg。

就像我在回答中所说的那样,一个人可以在SQL中做同样的事情。只是当这成为规则而不是例外时,NoSQL数据库通常更快,更自然地使用。从理论上讲,SQL是人们可以使用的最佳模型,但是当数据增长到一定大小时,它就无法适应某些模型,并且数据复制变得更快,更容易推论。
Andrea

3
那是公牛。关系模型涵盖了您可以在NoSQL中完成的所有工作,以及更多。NoSQL的唯一优点是内置了简单且不一致的扩展方法,并且易于使用。它与SQL无关,并且与不关心ACID属性有关。您可以在独立的SQL节点之间拥有同步作业,这些作业将具有与NoSQL存储完全相同(非常糟糕)的缩放和一致性属性。不同之处在于,如果您选择的话,SQL节点也可以具有一致性。
Morg。

1
如果您有5万亿行数据,并且希望在某种情况下从所有行中获取注释,该怎么办?如果使用SQL在表的注释字段上建立索引,会不会更快?全文索引将进一步改善这一点。
jwize 2015年

@morg-“关系模型涵盖了您可以在NoSQL中创建的所有内容以及更多内容。” 不是,不是 有很多类型的数据示例与关系模型非常不匹配,以至于将数据强加到关系模型中会导致效率低下。示例:在线游戏具有用于存储玩家清单的设施。播放器具有一组有限的编号插槽,每个插槽可以存储一个或多个特定类型的项目。大约有50种不同的项目,每种都有4-6个相关属性,并且有一些重叠,因此大约有80种可能的属性...
Jules

27

关于NoSQL,您缺少的一件事是NoSQl不能以任何方式与SQL进行比较。NoSQL是不是SQL的所有持久性技术的名称。文档数据库,键值数据库,事件数据库都是NoSQL。它们几乎在所有方面都不同,无论是保存数据的结构,查询,性能还是可用工具。

因此,如果有人在面试中问您这样的问题,那应该是答案。


4
如果说NoSQL具有一项杀手级功能,那就是可扩展性。这就是Facebook和Google使用它的原因。由于数据量巨大。NoSQL:当您必须处理大量数据时。
Pieter B

16

“ NoSQL”(或更准确地说:非关系)数据库为了提高速度而放弃了传统数据库的某些功能,但更重要的是为了实现水平可伸缩性。

缺少的功能取决于具体的产品,通常不支持完整的ACID属性,甚至不支持连接操作。这就是提高性能的代价。


1
将NoSQL描述为非关系式并不更精确。还有其他一些不属于NoSQL类别的旧的非关系型数据库。NoSQL的意义不仅仅在于非关系。请阅读以下内容以获取更多信息:martinfowler.com/bliki/NosqlDefinition.html
eddyP23

8

没错,在笼统的声明中指出这一点是胡说八道。这可能是重点。面试官可能会希望您回答一些问题,而不是一个答案,以帮助您弄清楚问题的背景是什么(什么样的数据,多少数据,在什么操作环境下等等),特定的NoSQL解决方案。他们将尝试找出您如何分析问题,并一路了解一下您对现有不同解决方案的了解程度。


是的,这是一个笼统的声明,如果我们接受它是正确的,那么问题的答案是:它取决于。
罗夫(Rolf)

5

通常只有在围绕数据库设计数据时,NoSQL数据库才有意义。

如果您打算将它们简单地用作RDBMS的替代品,那么性能可能会降低,而不是更高,尤其是如果您没有足够的预算来购买具有大量RAM的服务器时。

请看这篇比较MySQL磁盘空间使用情况和MongoDB磁盘使用情况的文章:http : //blog.trackerbird.com/content/mysql-vs-mongodb-disk-space-usage


3

哪个NoSQL数据库?哪个SQL数据库?如果有人告诉您NoSQL比SQL快,那么您应该走开。或者更好地观看此视频:

http://www.youtube.com/watch?v=b2F-DItXtZs

我不会说关于NoSQL的说法有一半是错误的,但是我会说,实际上对它不是很了解的人有很多NoSQL狂热分子。

SQL有其局限性(当然),但它也是一项非常成熟的技术,已广为人知,并且有大量的开发人员了解如何很好地使用它。我不能对所有形式的NoSQL说相同的话。


-2

面向列的数据库支持NoSql,其中RDBMS是面向行的数据库...例如说我们有一个Employee表,其中包含Name,Age,Salry,Address,EmployeeId等...我们将同一表放在MySql中(RDBMS支持)和HBase (NoSQL支持)。如果客户/客户编写查询以从1Lakh员工记录中获取平均年龄或Salery详细信息...会发生什么?

在RDBMS中,它将遍历每一行并收集值,并对结果求和与除。对于Columnar数据库,无需担心所有十万行的迭代。但是只处理一个计算速度更快的行。因此,有时候NoSQL比SQL快。这种情况下NoSQL不在乎ACID的投诉是值得的!


2
我已经修复了一些格式,但是我不确定您试图在两者之间取得什么。RDBMS也不总是支持ACID。

-3

忘记数据库的理论...。这一点一旦您理解了查询,就可以按照在应用程序中实际使用的确切方式将数据保存在nosql数据库中。

例如,您有一个客户模型,其中包含许多订单以及与每个订单相关的许多商品,那么他们也有许多保存的商品供以后购买...如果您是一家大型电子商务商店,假设有1000万客户和50万个订单。然后该客户登录到显示该确切数据的仪表板,查找该客户,加入订单以及每个订单项和保存的项目所需的sql数据库工作量是多少。在sql数据库中,所有这些数据可能都需要以某种方式进行连接...或者您可以在您的数据库中创建一个名为usercache的集合,并完全按照实际使用方式保存这些数据。因此,这确实可以是对单个字段[id]的单个查询,以获取所有这些数据。最重要的是,nosql数据库没有

那么,如果不是比nosql快,那么sql db可以查询单个Id字段吗?是的,但是sql数据库可以通过查询一个表和一个字段来返回您需要的所有数据吗?不,除非您执行类似将数据保存在大文本字段内的Json中的操作。但是现在数据不可查询,以备将来使用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.