Mongo最大索引大小

6

Mongo 文档讨论了最大索引大小。

Index Key
The total size of an indexed value must be less than 1024 bytes. 
MongoDB will not add that value to an index if it is longer than 1024 bytes.

使用db.collection.stats(),我可以看到我的平均文档大小为5 MB。如果我在一个占据文档50%的字段上建立索引,那么这是否意味着索引大小将为50% * 5 MB = 2.5 MB
我不明白如何计算单个文档的索引大小
1个回答

4
我不确定您为什么要索引如此大的字段,但是文档中指出,单个字段的索引长度不能超过1024个字节。如果您正在索引一个2.5MB的字段,它实际上没有被索引,而是被跳过了。
如果您需要索引真正大的字段数据,您需要想出一种在1024个字节以下的方式来表示它。例如,您可以计算CRC32并对其进行索引。虽然它可能不完美,但也可能足够好。
为了展示索引的奇特之处,我编写了一个简单的演示:
1. 新建数据库(test) 2. 在"value"字段上创建索引 3. 显示统计信息 4. 创建1000个文档,每个文档都有一个唯一的字段值,该值长度为102500个字符,并且每个文档都是唯一的 5. 显示统计信息。
示例:
> db.test.drop()
true
> db.test.ensureIndex({value:1})
> db.test.stats()
{
        "ns" : "test.test",
        "count" : 0,
        "size" : 0,
        "storageSize" : 8192,
        "numExtents" : 1,
        "nindexes" : 2,
        "lastExtentSize" : 8192,
        "paddingFactor" : 1,
        "systemFlags" : 1,
        "userFlags" : 0,
        "totalIndexSize" : 16352,
        "indexSizes" : {
                "_id_" : 8176,
                "value_1" : 8176
        },
        "ok" : 1
}
> var data="";for(var i=0;i<102500;i++){ data+= "z";};for(var i=0;i<1000;i++){ db.test.insert({value: data + i.toString() })};
> db.test.stats()
{
        "ns" : "test.test",
        "count" : 1000,
        "size" : 106480000,
        "avgObjSize" : 106480,
        "storageSize" : 123248640,
        "numExtents" : 8,
        "nindexes" : 2,
        "lastExtentSize" : 37625856,
        "paddingFactor" : 1,
        "systemFlags" : 1,
        "userFlags" : 0,
        "totalIndexSize" : 49056,
        "indexSizes" : {
                "_id_" : 40880,
                "value_1" : 8176
        },
        "ok" : 1
}

你会发现存储大小(storageSize)已经急剧增加,但totalIndexSize仍然很小。主要是因为它涵盖了_id
你也可以使用这种技术(http://docs.mongodb.org/manual/faq/storage/#how-can-i-check-the-size-of-indexes)查看特定索引的详细信息。
你可以看到value索引很小(大小)。
> db.test.$value_1.stats()
{
        "ns" : "test.test.$value_1",
        "count" : 1,
        "size" : 8176,
        "avgObjSize" : 8176,
        "storageSize" : 36864,
        "numExtents" : 1,
        "nindexes" : 0,
        "lastExtentSize" : 36864,
        "paddingFactor" : 1,
        "systemFlags" : 0,
        "userFlags" : 0,
        "totalIndexSize" : 0,
        "indexSizes" : {

        },
        "ok" : 1
}

如果我的文档长这样:{ _id : 1, favoriteFood : "cheese" },并且我在 favoriteFood 上建立了索引,那么我的索引大小会是多少? - Kevin Meredith
它会有所不同,因为它存储在B-Tree的块中,并且索引空间的增长模式也不同。此外,随着文档的更改,可能会存在一些未使用的空间。 - WiredPrairie
我添加了一些更多的细节,使用一种技术来更深入地查看索引。 - WiredPrairie
1
不应该使用CRC32哈希来“压缩”索引字段,而应该使用避免哈希冲突的更长哈希。SHA1(160位)可能已经足够了,但SHA512会进一步减少哈希冲突。实际上,git通过它们的SHA1哈希标识存储库对象而没有问题。有关更多信息,请参见https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection中的“关于SHA-1的简短说明”以及https://dev59.com/CW865IYBdhLWcg3wCqLI - Richard EB

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