似乎在MongoDB中,当您从文档the entire document needs to be loaded into the memory请求单个键值对时。
我想知道ArangoDB是否也是如此。
对于MongoDB来说,这似乎是一个基本限制,因为文档的基础格式是 BSON ,它是为遍历而设计的,而不是随机访问。另一方面,ArangoDB似乎使用 VPack ,它有一个小的索引表来执行随机访问。因此,除非查询的文档是荒谬的嵌套或小于操作系统页面大小,否则我希望只有包含给定键值对的页面才会加载到内存中。我是对的吗?
我问的原因是因为我正在设计一个数据库来存储大量数值实验的结果。一个实验可以产生(很少)高达1GB的数据。我想在每次实验中保留一份文件。但是,如果我有100个这样的实验,并且我想从每个实验只检索一个键值对,我的机器是否需要将100GB加载到ram中?
答案 0 :(得分:1)
使用MMFiles存储引擎,无论如何在加载集合时,所有文档都会加载到内存中。索引需要每次都重建,因为它们不会持久存在。文档数据会同步到磁盘。总的来说,这是一种主要是记忆的方法。
使用RocksDB存储引擎,文档和索引会保持不变,无需将集合全部或部分加载到内存中。相反,经常使用的文档有一套热门。它中的内容可以从磁盘加载。与MMFiles引擎不同,整个文档数据可能比主内存大几倍。
通常,查询中涉及的文档会使用RocksDB引擎作为整体加载到内存中。但是,如果您只询问FOR doc IN coll RETURN doc.title
:
Optimization rules applied:
Id RuleName
1 reduce-extraction-to-projection
在v3.3及更高版本中,这将soon be extended最多5个属性。
另一个优化只允许在索引请求的属性时从索引中回答查询,从而解除了将文档从磁盘加载到内存的必要性。
其中一些可能有助于您的用例的性能。但是,出于其他原因,您不应该存储1 GB大型文档:两个引擎都是仅附加的。任何修改都将导致新的文档修订。复制1 GB的文档数据以更新单个属性不会具有高效性。如果你不打算改变它们,那么这可能不是一个问题。