什么时候在MongoDB中创建专用集合以避免难以查询?

时间:2017-04-04 23:22:23

标签: mongodb bigdata

我问的是一个我认为没有一个简单的黑白问题的问题,但我要问的原则是明确的。

示例情况:

假设我拥有100万册图书,我一直希望始终能够获得前100名。 让我们假设每次执行此查询时都需要执行聚合函数,这使得它有点贵。

合理的是,我不会为每个请求(每秒100-1000)运行查询,而是创建一个专门的集合,只存储每分钟左右更新的前100本书,而不是运行困难的查询每秒100次,我每分钟只运行一次,而是从一小部分书籍中抽出来,这些书籍只包含100本书而且不需要查询(只需获取所有内容)。

这是我质疑的原则。

  • 我应该为每个查询创建一个专用的集合 使用
  • 我应该只为复杂的人做这件事吗?
  • 我如何衡量哪个足够复杂,哪个足够简单 按原样离开?
  • 这些类型的最佳做法是否有任何指导原则 的情况?
  • 如果查询经常运行且数据没有,那么是否存在问题 经常更改我应该将数据保存在服务器的内存中 直接访问?即使它是很多数据?多少钱太多了?

最后,

  • MongoDB中有没有办法缓存结果?

如果是这样,我如何告诉它获取缓存的结果,以及何时重新生成缓存?

谢谢大家。

2 个答案:

答案 0 :(得分:1)

在了解收藏细节之前,我们必须区分" 实时数据"相对于要求立即和实时呈现信息的数据。 "实时"的规则系统显然有很大的不同。

现在从你的例子开始。查询结果的缓存。答案不仅适用于MongoDB。数据架构师经常使用Redis或memcached(或其他缓存系统)来保存所有类型的信息。显然,这是系统和数据库可用内存的函数。您不希望通过为缓存提供过多的可用内存来削弱数据库,并且您不希望缓存因为太少而无法使用缓存。

在书本案例中,有100个顶级的,因为它肯定不是实时的努力,所以缓存查询并将缓存提供给请求是有意义的。您可以根据cron作业根据更新标记更新缓存(您创建该标记以通知程序100已更新),然后系统将运行$aggregate在后台。

现在到前几点:

  

我应该为经常使用的每个查询创建专用集合吗?

是和否。这取决于必须搜索到$aggregate您的回复的数据量。再次,它还取决于你的内存限制,顺便说一句,让我在速度,内核和内存方面添加整个服务器设置。 MHO - 缓存要好得多,因为它可以避免一直读取数据。

  

我应该只为复杂的人做吗?   我如何衡量哪个足够复杂,哪个足够简单,可以保留原样?

我认为任何人都不能真正为你的系统回答这个问题。复杂的查询只是$aggregate吗?或者它是$unwind然后是一大堆$group等选项?这实际上取决于数据集以及必须实际读取和筛选和操纵的信息量。它会影响你的IO,是的,再次影响你的记忆。

  

如果查询经常运行并且数据不经常更改,我是否应该将数据保存在服务器的内存中以供直接访问?即使它有很多数据?多少钱太多了?

请参阅上面的答案,这与您的其他问题直接相关。

最后:

  

在这些情况下是否有最佳做法指南?

您可以做的最好的事情是对代码中的过程进行计时,监视内存使用和限制,查看IO,研究集合上的实际读取和写入。

希望这有帮助。

答案 1 :(得分:1)

使用缓存来存储对象。例如,在Redis中使用Redis Lists

  

Redis列表只是字符串列表,按插入顺序排序

然后将expiry设置为timeoutspecific time

现在,只要您在Redis中遇到错过,请在MongoDB中运行查询并重新填充缓存。此外,由于缓存驻留在内存中,因此与MongoDB中的专用集合相比,您的提取速度非常快。

除此之外,您无需保留专用计算机,只需将其部署在应用程序计算机中即可。