【问题标题】:MongoDB calculate performance tradeoffsMongoDB 计算性能权衡
【发布时间】:2012-01-13 23:31:14
【问题描述】:

我的应用程序必须存储大量稀疏数据。
所有文档都被分成项目。
每个项目都有自己的数据库,有自己的集合和文档,但都在同一台服务器上。
现在我想让跨项目的查询和引用变得更容易。

所以我正在考虑将所有数据移动到 1 个数据库中,并让每个文档都有一个我可以查询的“项目”字段。
数据库架构将来自以下内容:

Project1 (Database)
    Task (Collection)
        {name: my_task, status: Completed, ...}

Project2 (Database)
    Task (Collection)
        {name: other_task, status: Started, ...}

类似于:

SingleDatabase
    Task (Collection)
        {name: my_task, status: Completed, project: Project1, ...}
        {name: other_task, status: Started, project: Project2, ...}

我的猜测是,它会对内存、磁盘使用和写入性能进行一些性能权衡。
问题是我不知道它会产生多大的影响,如果它值得去做的话。

问题是:
是否可以计算出此决定对服务器可能产生的影响?
比如:给定 X 个集合、X 个文档、X 个索引……服务器平均会有:X/s 慢写,需要 X 更多内存……等等。

【问题讨论】:

    标签: performance mongodb


    【解决方案1】:

    这是一个高度理论化的问题,“理论在性能方面是一个糟糕的伴侣”。即使有一个一致的、完善的理论,它也会非常复杂,因为你必须考虑缓存(即操作有历史、没有时间可逆性、需要非常详细的使用模式等。 )、许多非线性效应(大多数算法旨在实现一些 log(n) 或 n log(n) 行为)和不连续性“性能功能”(如果您的 RAM 不能再保存索引,则开始交换)和硬件特性(在 SSD 上交换比在主轴上快一个数量级)等。

    了解其行为方式的最快和最可靠的方法是实现它。该实现可能是不稳定的、hacky 的等等。但是您可以在几个小时内获得良好的性能指标。

    一些理论输入:

    本质上,使用多个数据库就像是桶排序:您有一些代码可以快速识别要查询的桶。在这些存储桶中,索引要小一些,因此要快一些。另一方面,搜索时间应该随着索引大小的增加而仅以对数方式增加。特别是对于大型收藏,这意味着几乎没有区别。

    磁盘空间将被更有效地使用(除非您大量调整数据库设置),因为 MongoDB 将为每个数据库分配一个大小为 16MB 的 .ns 文件和至少 64MB 的数据文件,即使您只存储一些文件。因此,如果小型数据库的数量很大,那么迁移后您的磁盘占用量应该会更好,尽管有额外的字段。

    RAM 占用空间的变化应该可以忽略不计,但内存是一个如此复杂的话题,我不会赌一毛钱。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 2013-01-02
      • 2015-10-19
      • 1970-01-01
      相关资源
      最近更新 更多