【发布时间】:2015-07-22 20:49:01
【问题描述】:
我有一个大约 5 GB 的静态数据库(甚至永远不会收到写入),而我的服务器 RAM 是 30 GB。我专注于尽快将复杂的聚合返回给用户,所以我看不出我不应该存储 (a) 索引和 (b) 整个数据集的原因完全在 RAM 中,并且 (c) 在 Mongo 服务器启动时自动存储在那里。目前我的主要瓶颈是运行组命令以从数百万行中查找唯一元素。
我的问题是,在新的 Mongo/WiredTiger 上运行时,我该怎么做 (a)、(b) 或 (c)?我知道“touch”命令不适用于 WiredTiger,因此 Internet 上的大多数信息似乎都已过时。 (a)、(b) 或 (c) 是否已经自动完成?我不应该对这个用例执行这些步骤吗?
【问题讨论】:
-
你能举一个你的模型和查询的例子吗?
-
好吧,我有几百万个文档,看起来像 `{field1: "a", field2: "b"},在 field1 和 field2 上都有索引,在 field1 和 field2 上有一个复合索引;我运行一个聚合管道,在其中匹配 field1 和 field2,然后按 field1 执行 $group 以获取 field1 的所有唯一值,然后 $group 对它们进行计数,并返回计数。当我想让它成为 时,返回计数可能需要几秒钟
-
使用 db.serverStatus() 来计算 mongo 对你的内存所做的总计。使用 mongostat 检查“dirty %”和“used %”,以确定 WiredTiger 正在使用多少缓存。另外我猜你在启动 Mongo 时不会以某种方式将 --wiredTigerCacheSizeGB 设置为某个小值?
-
这是我的块管理器和来自 db.serverStatus() 的缓存结果:pastebin.com/6MgqQyBS,我的 WiredTigerCacheSizeGB 设置为 25。
-
尝试运行 aggregate().explain() 看看你的索引是否正在使用
标签: mongodb wiredtiger database