文档型数据库为什么如此快速?

9

我只是想更好地理解,在我所学的几年中,基于文档的解决方案速度缓慢且需要大量的I/O。例如,在PHP项目中,通常会说最好使用内存缓存,如Redis、Memecache或APC,因为它们是基于内存而不是将数据缓存在实际文件中。

现在,所有这些NoSQL数据库已经出现了,我读到了关于它们比MySQL和其他数据库都要快得多的文章,它们是基于文档的。有人能帮助我理解这个理论吗?如果每个记录都是一个文档(文件),那么它为什么可以如此高效?最近我看到一个人在项目中使用Redis,他说他转而使用MongoDB,并且获得了比使用Redis更好的结果(我意识到我在比较缓存和数据库,但这不是真正的问题,我想知道文档式解决方案为什么比非文档式解决方案更快?)

6个回答

5

基于文档的并不一定意味着它们完全存储在文件系统中。一些部分仍然可以像索引一样保存在内存中。

基于文档的仅意味着数据库将数据存储在包中(就像每张纸都是数据集,您可以自由地在其上写)而不是像表格那样具有非常特定的结构。

http://en.wikipedia.org/wiki/Document-oriented_database

哦,为什么它们可以比Redis更快:
假设您需要在集合中存储一些非线性信息(即不是每个数据集看起来都相同,并且您在一个集合中拥有不同的数据类型)。在Redis中,您只能存储键值对,因此您将需要在自己的代码/实现中将它们链接回一个集合。在NoSQL数据库中,这由数据库以(可能)更优化的方式为您处理 :)


Redis 不仅可以存储键值对,还可以存储更多的数据类型(参见:http://redis.io/topics/data-types)。 - Martin Tournoij

3
NoSQL术语可能容易被误解,因为一些概念使用的名称与传统名称的含义不同:
- 基于文件的并不意味着数据存储将把每个记录写入文件——它的意思是说,数据存储中的记录不需要符合预定义的字段模式,只要是某种数据类型即可。可以将“文件”视为类似于XML、JSON或其他格式。 - 大多数NoSQL数据存储的性能优势是有代价的:通常会牺牲对良好理解的ACID承诺,以换取更宽松的一致性模型。 - 关系型SQL数据库的强大之处在于几乎每个查询都可以针对现有的模式编写。但这在NoSQL数据存储中并不总是正确的:在最极端的情况下,只有通过记录ID才能访问记录。 - 大多数NoSQL数据存储比典型的关系型数据库更容易扩展,它们是回答“我们必须从良好理解的关系型数据库中牺牲什么来克服扩展限制”的答案。

3
神奇的成分并不一定是“更快”的数据库,而是能够设计和实现“更快”系统的数据库。这就是为什么NoSQL数据库被认为是游戏变革者的原因。
几十年来,关系数据库一直是唯一的选择。许多基于SQL的系统会付出双倍的性能代价:一次是完整的ACID功能集(他们可能根本不需要),另一次是将其域数据塞入关系表模型中。
此外,大多数NoSQL数据库的一个共同特点是它们更为专业化,比SQL数据库的“通用情况”方法更简单。这意味着每个操作需要运行的逻辑/代码更少、数据结构更简单(可能需要较少的IO)以及总体上减少了开销,提高了性能。

0
第一件事是 - 您不能将NoSQL数据库与内存数据库进行比较。 NoSQL数据库适用于不适合放入内存的数据。
现在,关于NoSQL数据库,它们不仅仅是简单的文件,它们还有索引,可提供快速访问文件中的偏移量,这正是速度所在。

4
“NoSQL数据库是为那些无法放入内存的数据而设计的”这种说法完全是错误的。你为什么这样说? “NoSQL数据库是为那些无法放入内存的数据而设计的”这种说法是不准确的。为什么你这样说? - jgauffin
好的,我纠正自己,大多数情况下 它们被用于超过内存容量的结构。它们也可以用作内存中的存储,并且可能比关系型内存表提供更好的性能,因为它们在实现上更简单。话虽如此,有时通过在程序中自己实现数据结构,您可以获得更好的性能。 - thedrs
1
大多数情况下仍然是错误的。它们只是关系数据库管理系统的替代品,但是无模式且具有更好的聚合根解决方案。 - jgauffin

0

为了理解,可以考虑以下内容:

  • 使用MongoDB,您将以一种方式设计模式,即单个文档包含渲染页面所需的所有内容。
  • 使用MySQL(或任何其他关系型数据库),您将规范化数据并将其分割成许多表。要呈现相同的页面,您必须进行许多SQL查询。

尽管一个Mongo查询可能比一个MySQL查询慢,但将1个Mongo查询与100个MySQL查询进行比较会更快。


0

使文档数据库比关系型数据库更快的因素之一是本地性

文档是独立的单元:这使得性能更好(相关数据可以在磁盘上连续读取),并且使得在保留其本地性的同时将数据分布到多个服务器上变得更加容易。

文档数据库


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接