MongoDB 为 IdAccount 字段编制索引以便按帐户高效搜索
MongoDB indexing IdAccount field in order to make searches by account efficient
目前我在 MongoDB 上存储数据,如下所示:
- 每个客户 1 个数据库
- 每个客户大约有 40 个 collections
- 一共50个客户(有40*50=2000collections)
- 所有 50 个客户的数据库大小为 3 GB
我的 MongoDB 服务因错误
而崩溃
"Too many open files"
和MongoDB "Too Many Open Files"? Raise the limit显示了如何解决问题,但我仍然遇到崩溃问题。
错误 "Too many open files" 表示 MongoDB 进程正在使用的文件太多,并且 OS 正在抱怨。这就是我知道 MongoDB 正在使用大量文件的方式:
获取MongoDB和service mongodb status
的进程id。进程id会显示在info
然后获取MongoDB使用的文件我使用这个命令lsof -a -p <ProcessId>
当我 运行 该命令时,我看到该进程正在使用 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 个文件。从知道我将始终使用相同的数据库而不是拥有多个数据库。
目前我在 MongoDB 上存储数据,如下所示:
- 每个客户 1 个数据库
- 每个客户大约有 40 个 collections
- 一共50个客户(有40*50=2000collections)
- 所有 50 个客户的数据库大小为 3 GB
我的 MongoDB 服务因错误
而崩溃"Too many open files"
和MongoDB "Too Many Open Files"? Raise the limit显示了如何解决问题,但我仍然遇到崩溃问题。
错误 "Too many open files" 表示 MongoDB 进程正在使用的文件太多,并且 OS 正在抱怨。这就是我知道 MongoDB 正在使用大量文件的方式:
获取MongoDB和
service mongodb status
的进程id。进程id会显示在info然后获取MongoDB使用的文件我使用这个命令
lsof -a -p <ProcessId>
当我 运行 该命令时,我看到该进程正在使用 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 个文件。从知道我将始终使用相同的数据库而不是拥有多个数据库。