【发布时间】:2015-12-20 23:10:00
【问题描述】:
我正在为博客网络应用程序设计架构。在主页上,我必须显示仅显示每个帖子的标题、副标题、日期和作者的帖子列表。单击列表中的项目时,我必须显示相应的完整帖子。
为此,我使用了 2 个模式(postInfo & postBody),这样我的文档在与模式对应的集合中可以具有几乎相同的大小。这会在某种意义上提高性能吗?假设当我查询帖子列表时,MongoDB 会快速完成操作,因为文档大小几乎相同。
【问题讨论】:
我正在为博客网络应用程序设计架构。在主页上,我必须显示仅显示每个帖子的标题、副标题、日期和作者的帖子列表。单击列表中的项目时,我必须显示相应的完整帖子。
为此,我使用了 2 个模式(postInfo & postBody),这样我的文档在与模式对应的集合中可以具有几乎相同的大小。这会在某种意义上提高性能吗?假设当我查询帖子列表时,MongoDB 会快速完成操作,因为文档大小几乎相同。
【问题讨论】:
MongoDB 是否会快速完成操作(查询),因为文档大小几乎相同。
没有。文档大小相似性对查询性能没有任何影响。平均文档大小 - 是的(获取更大的文档显然会更昂贵),但不是大小相似度。
为此,我使用了 2 个架构(blogInfo 和 blogBody)
我假设您的意思是 postInfo 和 postBody。在这种情况下,不要这样做。它只会使您的代码复杂化。将所有发布数据存储在同一个文档中。当您不需要正文(在主页上呈现索引)时,请不要获取它。如果您不知道,mongodb 支持获取文档字段的子集(例如标题和摘录)。
当集合中的流失率很高时,文档大小的相似性很重要:文档被频繁地删除和插入。在这种情况下,相同大小的文档将减少数据文件的碎片。对于您的典型博客而言,情况并非如此。
【讨论】:
简单明了:不。索引保存文档的起始位置,索引键具有特定值。当搜索索引(btree)并且我的键匹配时,MongoDB 跳转到数据文件中的所述位置,读取文档长度标题,分配相应的缓冲区,然后读取文档的二进制形式并将其解组。如您所见,文档大小唯一重要的是分配内存。一次。在数据不在内存工作集中的情况下。
现在让我们假设您没有索引。如何找到匹配的文档?好吧,实际上很简单:对整个集合的每个文档都重复相同的过程 - 一个大规模的操作,其中缓冲区的分配只是苍白,因为它甚至比从 SSD 读取速度快几个数量级(是的,复数) .
如何建模?答案很简单:它是一对一的关系,所以应该写在一个文档中。
【讨论】: