MongoDB索引大小是否取决于字段大小?

费利克斯

在MongoDb中,有一个32位的int类型(4个字节)和一个96位的ObjectId类型(12个字节)。我注意到32位int字段上的索引大于ObjectId字段上的索引,而根据此问题,我期望相反:在MongoDB中是否有任何工具可以估算索引大小?

这是特定于ObjectId的吗,怎么可能?

以下是一些统计数据,它们显示了差异,使用默认配置(WiredTiger引擎+活泼的压缩级别)的MongoDB 3.2.9和mongodb-java-driver 3.2

“ _id”作为ObjectId:

    > db.objectId.stats()
{
    "ns" : "test1.objectId",
    "count" : 500000,
    "size" : 20500000,
    "avgObjSize" : 41,
    "storageSize" : 6737920,
    [...]
    "nindexes" : 1,
    "totalIndexSize" : 4300800,
    "indexSizes" : {
        "_id_" : 4300800
    }
}

“ _id”作为int32(线性插入):

     > db.int32linear.stats()
{
    "ns" : "test1.int32linear",
    "count" : 500000,
    "size" : 16500000,
    "avgObjSize" : 33,
    "storageSize" : 5586944,
    [...]
    "nindexes" : 1,
    "totalIndexSize" : 5255168,
    "indexSizes" : {
        "_id_" : 5255168
    }
}

“ _id”为int32(随机插入):

> db.int32random.stats()
{
    "ns" : "test1.int32random",
    "count" : 500000,
    "size" : 16500000,
    "avgObjSize" : 33,
    "storageSize" : 5595136,
    [...]
    "nindexes" : 1,
    "totalIndexSize" : 5378048,
    "indexSizes" : {
        "_id_" : 5378048
    }
}

这是重现测试的代码:

import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.bson.Document;

public class Main {

    public static void main(String[] args) {

        List<Document> listDoc = new ArrayList<>(); 

        MongoClient mongoClient = new MongoClient(); 
        MongoDatabase db = mongoClient.getDatabase("test1");

        MongoCollection<Document> objectId = db.getCollection("objectId");
        MongoCollection<Document> int32linear = db.getCollection("int32linear");
        MongoCollection<Document> int32random = db.getCollection("int32random");

        for(int i = 0; i<500000; i++){
            listDoc.add(new Document("field", "content" ));
        }
        objectId.insertMany(listDoc);
        listDoc.clear();

        for (int i = 0; i<500000; i++){
            listDoc.add(new Document("_id", i).append("field", "content"));
        }
        int32linear.insertMany(listDoc);
        // unsort the array
        Collections.shuffle(listDoc); 

        int32random.insertMany(listDoc);

        mongoClient.close();

    }
}
用户名

我不确定,但:WildTiger正在有效地压缩对象ID密钥。如果您查看它们的生成方式,并且所有文档都以超快的速度(几秒钟内)插入,那么在一台计算机上,对象ID将会有一个很长的通用前缀。WildTiger的键前缀压缩将非常有效。

那么,为什么这对递增整数不起作用?由于小端格式。

如果上述假设是正确的,则在实际系统中,在实际情况下,插入时间间隔更大,并且有许多服务器(分片),ObjectId索引可能会比int索引要大一些,但其大小仍然相当合理。如果要检查此选项,请尝试关闭索引构建上的压缩。

总的来说,我认为这是个好消息,因为问题不是int索引很大,而是ObjectId索引有效-鉴于有记录,每个条目〜10字节是合理的(尽管我可以想象做得更好)除每个文档的密钥之外的ID。

https://docs.mongodb.com/manual/reference/method/ObjectId/

ps我相信递增的int索引要比随机索引小一点,因为mmap对于递增键有适度的优化。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

MongoDB文档更新的性能是否取决于文档大小?

来自分类Dev

CGGlyph是否取决于字体大小?

来自分类Dev

为什么在MongoDB中,字段索引的大小会有所不同,具体取决于它是升序还是降序

来自分类Dev

如何获取大小取决于MongoDB汇总中的某些条件

来自分类Dev

std :: map :: find性能是否取决于密钥大小?

来自分类Dev

节点大小取决于度

来自分类Dev

动作取决于窗口大小jQuery

来自分类Dev

对象的大小取决于其读取的内容

来自分类Dev

IPA的大小取决于哪些因素?

来自分类Dev

fftw输出取决于输入的大小吗?

来自分类Dev

或突然变慢,取决于阵列大小

来自分类Dev

HTML SELECT的大小取决于所选的选项

来自分类Dev

扣除类型取决于大小C ++

来自分类Dev

CSS的列数取决于大小

来自分类Dev

HTML SELECT的大小取决于所选的选项

来自分类Dev

字体大小取决于单词数

来自分类Dev

VirtualAlloc的断点取决于分配大小

来自分类Dev

<p> 大小取决于其中的文本

来自分类Dev

div 的大小取决于其中的文本

来自分类Dev

可扩展的 wxSizer 取决于窗口大小

来自分类Dev

如何使按钮,对象等的大小取决于窗口大小?

来自分类Dev

使布局大小取决于XML中的图像大小

来自分类Dev

MongoDB索引大小

来自分类Dev

MongoDB索引大小

来自分类Dev

QTabWidget的大小取决于当前选项卡

来自分类Dev

结构大小和内存布局取决于#pragma pack

来自分类Dev

Tumblr:photoUrl-(size)-大小取决于类?

来自分类Dev

UIScrollview动态内容的大小取决于项目数

来自分类Dev

CSV调整大小列,具体取决于内容