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