2012-01-13 54 views
0

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

因此,我正在考虑将所有数据移动到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更多内存......等等。

回答

2

这是一个非常理论性的问题,而“关于性能的理论是一个糟糕的伴侣”。即使存在一致的,公认的理论,由于必须考虑高速缓存(即操作具有历史记录,没有时间可逆性,需要非常详细的使用模式等),所以它会变得复杂,非常复杂,线性效应(大多数算法旨在实现某些日志(n)或n日志(n)行为)和“性能函数”中的不连续性(如果您的RAM不能再保存索引,则交换开始),和硬件特性(在SSD上交换的速度比在主轴上快一个数量级)等等。

找出它如何工作的最快和最可靠的方法是实施它。该实现可以是片状,哈克和什么不是。但是你可以在几个小时内得到很好的表现。

一些理论输入:

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

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

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