在MongoDb中,有32位int类型(4字节)和96位ObjectId类型(12字节)。我注意到在32位int域上的索引大于ObjectId域,而根据这个问题,我期待着相反的结果:Are there any tools to estimate index size in MongoDB?MongoDB索引大小是否取决于字段大小?
这是特定于ObjectId的,它怎么可能?
以下是示出差异,使用MongoDB的3.2.9和MongoDB-java的驱动器3.2的默认配置(WiredTiger发动机+活泼的压缩水平)
“_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或mmap?不是一个答案,而是一些要尝试的事情:随机化而不是有序的int值,并且在测试之前删除集合而不是删除文档以获得干净的起点,因为如果您只删除了所有的删除分配区域记录。 – user3973
这是与有线Tiger发动机。我根据你的评论更新了测试,但仍然得到相同的结果(请参阅我的编辑) – felix