Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
何时';现在是在MongoDB中创建专用集合以避免困难查询的时候了吗?_Mongodb_Bigdata - Fatal编程技术网

何时';现在是在MongoDB中创建专用集合以避免困难查询的时候了吗?

何时';现在是在MongoDB中创建专用集合以避免困难查询的时候了吗?,mongodb,bigdata,Mongodb,Bigdata,我在问一个问题,我认为这不是一个简单的黑白问题,但我所问的原则是明确的 示例情况: 假设我收藏了100万本书,而且我一直希望能获得前100名。 让我们假设每次执行此查询时都需要执行聚合函数,这使得它有点昂贵 合理的做法是,我不会对每个请求(每秒100-1000次)运行查询,而是创建一个专门的集合,只存储每分钟左右更新的前100本书,因此,我不会每秒运行100次困难的查询,而是每分钟只运行一次,取而代之的是从一个只有100本书而且不需要查询(只需获取所有内容)的小藏书集中提取 这就是我要问的校长。

我在问一个问题,我认为这不是一个简单的黑白问题,但我所问的原则是明确的

示例情况:

假设我收藏了100万本书,而且我一直希望能获得前100名。 让我们假设每次执行此查询时都需要执行聚合函数,这使得它有点昂贵

合理的做法是,我不会对每个请求(每秒100-1000次)运行查询,而是创建一个专门的集合,只存储每分钟左右更新的前100本书,因此,我不会每秒运行100次困难的查询,而是每分钟只运行一次,取而代之的是从一个只有100本书而且不需要查询(只需获取所有内容)的小藏书集中提取

这就是我要问的校长。

  • 我是否应该为经常出现的每个查询创建一个专用集合 用过吗
  • 我应该只为复杂的人做吗
  • 我如何衡量哪一个足够复杂,哪一个足够简单 就这样离开
  • 在这些类型的项目中是否有最佳实践指南 情况
  • 是否存在这样一种情况:如果查询运行得如此频繁,而数据却不运行 经常更改,我应该将数据保存在服务器的内存中 直接访问?即使有很多数据?多少是太多
最后,

  • MongoDB中有没有缓存结果的方法
如果是这样,我如何告诉它获取缓存结果,以及何时重新生成缓存


谢谢大家。

在讨论收集细节之前,我们必须区分“实时数据”与不需要立即和实时显示信息的数据。“实时”系统的规则显然大不相同

现在让我们从结尾开始讲你的例子。查询结果的缓存。答案不仅仅是MongoDB。数据架构师通常使用Redis或memcached(或其他缓存系统)来保存所有类型的信息。不过,很明显,这是系统和数据库可用内存量的函数。您不希望通过为缓存提供太多的可用内存来削弱DB,也不希望缓存提供太少的可用内存而变得无用

在本书中,在前100名中,由于这肯定不是一项实时工作,因此缓存查询并将缓存提供给请求是有意义的。您可以基于cron作业或更新标志(创建该标志以通知程序100已更新)更新缓存,然后系统将在后台运行
$aggregate

现在谈谈前几点:

我是否应该为经常使用的每个查询创建一个专用集合

是和否。这取决于要搜索到
$aggregate
您的响应所需的数据量。同样,这也取决于您的内存限制,顺便说一句,让我添加整个服务器设置的速度,核心和内存。MHO-cache要好得多,因为它避免了一直从数据中读取数据

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

我不认为任何人能为你的系统对这个问题做出黑白的回答。复杂的查询是否只是一个
$aggregate
?或者是
$unwind
然后是一系列
$group
等选项?这实际上取决于数据集以及实际必须读取、筛选和操作多少信息。它会影响IO,是的,同样会影响内存

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

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

最后:

在这类情况下,是否有最佳实践指南

在这里,您所能做的最好的事情就是对代码中的过程计时,监视内存使用和限制,查看IO,研究集合上的实际读写


希望这有帮助。

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

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

然后设置为a或a

现在,无论何时您在Redis中丢失了数据,都可以在MongoDB中运行查询并重新填充缓存。此外,由于缓存驻留在内存中,因此与MongoDB中的专用集合相比,您的抓取速度将非常快

除此之外,您不必保留专用机器,只需将其部署在应用程序机器中即可