Mongodb 为什么数字上的索引比字符串上的索引大?

Mongodb 为什么数字上的索引比字符串上的索引大?,mongodb,Mongodb,mongo db 1.4.1 2个集合,相同的数据,但对字段“x”使用不同的数据类型(foo-string,bar-number): 在案例2中,x_1更大,而您可能会期望相反的结果?索引中的int值(或long)在mongodb中存储为double,我猜是8字节。因此,这可能是索引大小比字符串值大的原因 检查源代码。 整数存储为bson类型16,它是一个32位整数。如果整数是一个分类值,您可以将其存储为仅一个字符长的字符串,则它应该仅为8位(UTF-8字符串) 为什么你会期望相反的结果呢?我必

mongo db 1.4.1

2个集合,相同的数据,但对字段“x”使用不同的数据类型(foo-string,bar-number):

在案例2中,x_1更大,而您可能会期望相反的结果?

索引中的int值(或long)在mongodb中存储为double,我猜是8字节。因此,这可能是索引大小比字符串值大的原因

检查源代码。

整数存储为bson类型16,它是一个32位整数。如果整数是一个分类值,您可以将其存储为仅一个字符长的字符串,则它应该仅为8位(UTF-8字符串)

为什么你会期望相反的结果呢?我必须承认这有点让人困惑,我的意思是平均对象大小更小,事实上除了大小之外,numbner的所有统计数据都更小,事实上大小与统计输出中的其余数据不太相关@DekDekku可能是因为表示数字所需的字节比表示字符串所需的字节要少。如果字符串很小(如果集合中的所有字符串都是“foo”和“bar”,我也不会感到惊讶),而数字总是占用相同的空间。但我无法检查实际数据,所以…@DekDekku“x”实际上是一个数字[0;1000];foo集合的所有字段都是字符串,而bar的所有字段都是数字;所以这个例子是索引“1”和1,这是所有“空间”的来源;但是我也希望索引更小,因为写一个数字比写一个字符串需要更少的字节(因为mongo使用UTF8)。我认为用UTF-8表示数字与ASCII表示相同,每个字符1字节,但我可能错了。而所有整数都使用4字节。
> db.foo.ensureIndex({x:1});
> db.bar.ensureIndex({x:1});
> db.foo.stats();
{
    "ns" : "impressions.foo",
    "count" : 50000,
    "size" : 23519184,
    "avgObjSize" : 470.38368,
    "storageSize" : 37797888,
    "numExtents" : 8,
    "nindexes" : 2,
    "lastExtentSize" : 15290368,
    "paddingFactor" : 1,
    "systemFlags" : 0,
    "userFlags" : 0,
    "totalIndexSize" : 2526384,
    "indexSizes" : {
        "_id_" : 1463504,
        "x_1" : 1062880
    },
    "ok" : 1
}
> db.bar.stats()
{
    "ns" : "impressions.bar",
    "count" : 50000,
    "size" : 21594256,
    "avgObjSize" : 431.88512,
    "storageSize" : 22507520,
    "numExtents" : 7,
    "nindexes" : 2,
    "lastExtentSize" : 11325440,
    "paddingFactor" : 1,
    "systemFlags" : 0,
    "userFlags" : 0,
    "totalIndexSize" : 2730784,
    "indexSizes" : {
        "_id_" : 1463504,
        "x_1" : 1267280
    },
    "ok" : 1
}