【问题标题】:MongoDB indexing IdAccount field in order to make searches by account efficientMongoDB 索引 IdAccount 字段以便通过帐户高效搜索
【发布时间】:2020-01-22 13:24:22
【问题描述】:

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

  • 每位客户 1 个数据库
  • 每个客户有大约 40 个收藏
  • 一共50个客户(有40*50=2000个收藏)
  • 所有 50 位客户的数据库大小为 3 GB

我的 MongoDB 服务因错误而崩溃

“打开的文件太多”

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

错误“打开的文件过多”表示 MongoDB 进程使用的文件过多并且操作系统正在抱怨。这就是我知道 MongoDB 正在使用大量文件的方式:

  1. 通过service mongodb status获取MongoDB的进程id。进程ID将显示在信息中

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

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

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


PS:在另一台 Linux 计算机上,我创建了一个 MongoDB 数据库,其中只有 1 个数据库和 40 个集合。我用 6 GB 的数据填充了 40 个集合(是现在的两倍)。 MongoDB 使用了 200 个文件,尽管这个数据库是原来的两倍!

【问题讨论】:

    标签: linux mongodb multi-tenant


    【解决方案1】:

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

    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 个文件。从知道开始,我将始终使用同一个数据库,而不是拥有多个数据库。

    【讨论】:

      猜你喜欢
      • 2016-11-23
      • 1970-01-01
      • 2020-09-18
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      • 2010-09-23
      • 1970-01-01
      • 2012-08-30
      相关资源
      最近更新 更多