为什么在MongoDB中,一个字段的索引大小会因为是升序还是降序而有所不同?

5

我在我的集合中有两个"created"字段的单索引。其中一个索引按升序排序,另一个按降序排序。按降序排序的索引比按升序排序的索引要大。"created"字段保存了JavaScript日期对象。这是什么原因呢?

"indexSizes" : {
    "_id_" : 212862160,
    "created_1" : 136424736,
    "created_-1" : 252376768
},

这里是来自collection.getIndexes()的详细信息。唯一的区别是降序索引是在后台创建的。
{
    "v" : 1,
    "key" : {
        "created" : 1
    },
    "name" : "created_1",
    "ns" : "Production.accounts"
},
{
    "v" : 1,
    "key" : {
        "created" : -1
    },
    "name" : "created_-1",
    "ns" : "Production.accounts",
    "background" : true
}

现在这是一个公平的要求。我自己也在想为什么“升序”形式的大小比_id索引小。值得一提的是,如果_idObjectId类型并且已经是“单调”的或者“始终增加”的,那么它就是您集合中“创建顺序”的自然指示器。当然,除非您有其他原因需要时间戳。 - user3561036
创建的值存储类型是什么?你能重新创建吗?我尝试使用一个简单的Mongo集合,升序/降序的索引大小相同。 - jcalloway
2
后台索引最终比前台创建的索引更大。此外,对于单字段索引,升序和降序版本的顺序无关紧要,因此不需要同时创建两个版本。 - JohnnyHK
1个回答

2
区别在于升序索引是在前台创建的,而降序索引是在后台创建的。
从关于后台索引创建的文档中可以得知:
“后台索引构建需要更长的时间才能完成,并且会生成一个最初比前台构建的索引更大或不够紧凑的索引。随着时间的推移,后台构建的索引的紧凑性将接近前台构建的索引。”
因此,如果您希望索引尽可能紧凑,请在前台创建索引,但是后台索引也会随着时间的推移变得更加紧凑。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接