MongoDB 为 IdAccount 字段编制索引以便按帐户高效搜索

MongoDB indexing IdAccount field in order to make searches by account efficient

目前我在 MongoDB 上存储数据,如下所示:

我的 MongoDB 服务因错误

而崩溃

"Too many open files"

MongoDB "Too Many Open Files"? Raise the limit显示了如何解决问题,但我仍然遇到崩溃问题。

错误 "Too many open files" 表示 MongoDB 进程正在使用的文件太多,并且 OS 正在抱怨。这就是我知道 MongoDB 正在使用大量文件的方式:

  1. 获取MongoDB和service mongodb status的进程id。进程id会显示在info

  2. 然后获取MongoDB使用的文件我使用这个命令lsof -a -p <ProcessId>

  3. 当我 运行 该命令时,我看到该进程正在使用 1010 个文件!

我创建的客户数据库越多,这个数字就越大!所以我想我的解决方案是将所有数据库合并为一个。如果这样做,我将不得不将 AccountId 列添加到我的所有 collections。 如果我进行更改,我应该为 AccountId 分配什么索引,以便我的搜索更有效率? 例如,我想快速获取 IdAccount=34 的所有 PurchaseOrders。执行此更改是你们推荐的吗?我应该将所有 50 个数据库合并为一个吗?


PS: 在另一台 Linux 计算机上我创建了一个 MongoDB 数据库,只有 1 个数据库和 40 个 collections .我用 6 GB 的数据填充了 40 collections(我现在拥有的数据的两倍)。 MongoDB 使用了 200 个文件,即使这个数据库是两倍大!

发布这个问题的同一天,我将所有数据库合并为一个。此外,我添加了以下索引:

db.CollectionA.createIndex({Id_Account:1})
db.CollectionB.createIndex({Id_Account:1})
// etc...

为了证明我的查询仍然像以前一样高效:

db.getCollection('CollectionA').find({"Id_Account":28}).explain("executionStats")

该查询给出了执行统计信息。它会告诉您它搜索了多少文档以及匹配了多少文档。使用 NO 索引将导致我每次都扫描整个集合 find({"Id_Account":28})

Mongo 到目前为止还没有崩溃,它从来没有锁定超过 300 个文件。从知道我将始终使用相同的数据库而不是拥有多个数据库。