13

我正在寻找一种工具来根据以下几个信号对 Mo​​ngoDB 索引的大小进行适当的估计:

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

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

它不需要精确到一点点,但是通过一些关于 B-Trees 和索引实现的假设,我相信它可能足够合理以提供帮助。

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

4

4 回答 4

24

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

2 * [ n * ( 18 bytes overhead + avg size of indexed field + 5 or so bytes of conversion fudge factor ) ]

n您拥有的文件数量在哪里。

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

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

于 2011-12-22T22:47:04.453 回答
3

另一种计算方法是将大约 1000 个左右的文档引入每个集合中,换句话说,构建一个小规模模型,说明您将在生产中最终得到的内容,创建索引或您拥有的内容,然后根据以下内容计算最终数字db.collection.stats()平均。

编辑(来自评论):

Tyler 的回答 描述了大约 MongoDB 2.0 的原始 MMAP 存储引擎,但这个公式绝对不适用于现代版本的 MongoDB。WiredTiger 是 MongoDB 3.2+ 中的默认存储引擎,使用索引前缀压缩,因此索引大小将根据键值的分布而变化。还有多种索引类型和选项可能会影响大小。合理估计的最佳方法是使用经验估计和具有代表性的测试数据来预测您的预期增长。

于 2014-08-06T16:53:16.147 回答
3

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

db.collection.stats()

更多细节在这里:http ://docs.mongodb.org/manual/reference/method/db.collection.stats/#db.collection.stats

于 2013-05-09T18:21:20.880 回答
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");
于 2021-02-04T21:00:15.737 回答