有没有办法在启动时将mongodb索引加载到ram中?

时间:2013-04-20 11:15:59

标签: php mongodb ubuntu

我正在测试mongo db。我有3个集合,其中一个是用户集合,有1000万个文档。索引集合后,查询大约需要0.002毫秒。无论如何,在重新启动-ubuntu 12.04框后 - 相同的查询大约需要200毫秒。就好像集合上没有索引一样。这是重启盒子后mongodb的正常行为吗?有没有办法在启动时将索引加载到ram中?

1 个答案:

答案 0 :(得分:2)

正常的MongoDB行为是将数据和索引分页到应用程序使用的内存中,并决定将哪些内容分页到操作系统的内存管理中。应用程序通常使用的数据和索引称为“工作集”。

已运行一段时间的mongod服务器应该已经在内存中具有自然工作集,因此除非您了解影响,否则您不需要(或想要)安排夜间数据/索引重新加载这个。

有几种不同的方案可以“预热”服务器以将适当的数据加载到内存中。

注意:请谨慎使用

通常这些方法只能用于“冷服务器”(即初始启动时)而不是夜间。如果您的数据和数据,您可以轻松地最终交换有用的数据或索引(并对性能产生负面影响)。索引大于MongoDB可用的内存。您还可以通过强制将不常用的数据或索引加载到RAM中来使用超过必要的内存。

场景#1:加载给定集合的所有数据或索引

在MongoDB 2.2+中,您可以使用touch command将磁盘中的集合的所有数据或索引加载到内存中。如果您需要处理集合的完整数据或索引,并且具有可用于存储这些数据的内存,这将非常有用。

场景#2:根据当前工作集

加载子集

如果要加载与当前工作集对应的数据子集,可以运行一些查询来“预热”数据库。 Parse的开发人员开源了一些实用工具,通过抽样和重放当前操作来帮助提供更具体的预热:Techniques for Warming Up a MongoDB Secondary

场景#3:运行应用程序的常用查询以预加载

您可以为应用程序运行一组典型查询,与集合的“所有”数据/索引或当前操作样本相比,可能会加载更实际的工作集。