我正在测试 mongo 数据库。我有 3 个集合,其中一个是用户集合,有 1000 万个文档。索引集合后,查询大约需要 0,002 毫秒。无论如何,重新启动框 -ubuntu 12.04 后 - 相同的查询大约需要 200 毫秒。就好像集合上没有索引一样。这是重启盒子后mongodb的正常行为吗?有没有办法在启动时将索引加载到内存中?
1 回答
正常的 MongoDB 行为是将数据和索引分页到应用程序使用的内存中,并将分页内容的决定留给操作系统的内存管理。您的应用程序通常使用的数据和索引称为“工作集”。
已经运行了一段时间的mongod
服务器应该已经在内存中具有自然工作集,因此除非您了解其影响,否则您不需要(或不想)安排每晚的数据/索引重新加载。
有几种不同的场景可以“预热”服务器以将适当的数据加载到内存中。
注意:谨慎使用
通常,这些方法应该只在“冷服务器”(即初始启动时)而不是每晚使用。如果您的数据和索引大于 MongoDB 可用的内存,您很容易最终换出有用的数据或索引(并对性能产生不利影响)。您还可以通过强制将不经常使用的数据或索引加载到 RAM 中来最终使用比必要更多的内存。
场景 #1:加载给定集合的所有数据或索引
在 MongoDB 2.2+ 中,您可以使用该touch
命令将集合的所有数据或索引从磁盘加载到内存中。如果您需要使用集合的完整数据或索引,并且有可用内存来存储它们,这会很有帮助。
场景#2:根据当前工作集加载一个子集
如果要加载与当前工作集相对应的数据子集,可以运行一些查询来“预热”数据库。Parse 的开发人员开源了一些实用程序,以通过采样和重放当前操作来帮助提供更具体的预热:预热MongoDB 辅助的技术。
场景 #3:运行应用程序的常见查询以预加载
您可以为您的应用程序运行一组典型查询,与集合或当前操作样本的“所有”数据/索引相比,这可能会加载更真实的工作集。