MongoDB - _id 索引大小的奇怪差异

Posted

技术标签:

【中文标题】MongoDB - _id 索引大小的奇怪差异【英文标题】:MongoDB - Weird difference in _id Index size 【发布时间】:2020-12-19 08:56:03 【问题描述】:

我在 12 个分片上有两个分片集合,文档数量相同。 Collection1 的 shard key 是复合的(使用了两个字段),它的文档由 4 个字段组成。 Collection2 2 的 shard key 是单一的,它的文档由 5 个字段组成。

通过 db.collection.stats() 命令,我得到了有关索引的信息。 我觉得奇怪的是,对于 Collection1,_id 索引的总大小为 1342MB。 相反,Collection2 的 _id 索引的总大小为 2224MB。这种差异合理吗?由于文档数量相同,我一直在等待总大小会更小。请注意,两个集合的分片键不集成 _id 字段。

【问题讨论】:

可能是这个原因:collStats.totalIndexSize - "...返回的大小反映了压缩后的大小。" @prasad_ 是的,它反映了压缩后的大小,但即使在这种情况下,我们难道不希望有相似的大小吗? 【参考方案1】:

MongoDB 对索引使用前缀压缩。

这意味着如果索引中的连续值以相同的字节序列开头,则存储第一个值的字节,后续值包含指示前缀长度的标记。

根据 _id 值的数据类型,这可能是相当多的。

也可能有orphaned documents 导致一个节点的_id 索引中有更多条目。

【讨论】:

_id值的数据类型是默认的,基于ObjectId(十六进制字符串)。也许,这是因为分片之间的数据分布? 完全有可能。您可以通过直接连接到每个分片的主分片并使用db.collection.count() 来检查

以上是关于MongoDB - _id 索引大小的奇怪差异的主要内容,如果未能解决你的问题,请参考以下文章

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

在 MongoDB 数组中查找索引

Mongodb复合索引 - 也内置_id排序?

mongodb批量查询库中表的统计信息

Mongodb索引

MongoDB索引的种类与使用