是否有任何工具可以估算MongoDB中的索引大小?

时间:2011-12-22 17:27:27

标签: mongodb indexing b-tree

我正在寻找一种工具来根据以下几个信号对MongoDB索引的大小进行合理估计:

  • 我的收藏中有多少文件
  • 索引字段的大小
  • 我使用的_id的大小,如果不是ObjectId
  • 地理位置/非地理

有没有人偶然发现过这样的事情?我可以想象,一旦Mongo的性能下降,一旦它撞到内存墙并且文档开始被分页到磁盘,这将是非常有用的。如果我有一个正常运行的数据库并且想要添加另一个索引,我唯一能够知道它是否太大的方法就是实际添加它。

它不需要精确到位,但是对于B-Trees和索引实现的一些假设我确信它可能足够合理有用。

如果这不存在,我想建立并开源它,所以如果我错过了这个计算所需的任何参数,请在答案中加入。

4 个答案:

答案 0 :(得分:21)

我刚刚与一些10gen工程师交谈,但没有工具,但您可以根据此公式进行包络计算:

2 * [n *(18字节开销+索引字段的平均大小+转换软糖因子的5个左右字节)]

其中n是您拥有的文件数量。

开销和转换填充是mongo特定的,但2x来自b-tree数据结构,大致是半满(但在最坏的情况下已经分配了100%的空间,一个完整的树需要)。

我会解释更多,但我现在正在自己学习。此演示文稿将包含更多详细信息:http://www.10gen.com/presentations/mongosp-2011/mongodb-internals

答案 1 :(得分:4)

您可以使用以下命令检查集合上索引的大小:

db.collection.stats()

此处有更多详情:http://docs.mongodb.org/manual/reference/method/db.collection.stats/#db.collection.stats

答案 2 :(得分:1)

计算的另一种方法是将〜1000个左右的文档摄取到每个集合中,换句话说,构建一个小规模的模型,用于生产中最终的内容,创建索引或者你有什么并计算最终数字基于db.collection.stats()平均值。

这有意义吗? :)

答案 3 :(得分:0)

最好的选择是在非产品部署中进行测试!

插入1000个文档并检查索引大小,插入100000个文档并检查索引大小等等。

在循环中检查所有集合总索引大小的简单方法:

  var y=0;db.adminCommand("listDatabases").databases.forEach(function(d){mdb=db.getSiblingDB(d.name);mdb.getCollectionNames().forEach(function(c){s=mdb[c].stats(1024*1024).totalIndexSize;y=y+s;print("db.Collection:"+d.name+"."+c+" totalIndexSize: "+s+" MB"); })});print("============================");print("Instance totalIndexSize: "+y+" MB");