我一直在玩 mongoDb 来检查它的性能。我用一个小集合在 Java 中创建了一个小测试:
public class ClientWord {
@Id
private ObjectId id;
@Field(value="client_id")
private ObjectId clientId;
private String text;
private int value;
....
本文档有一个双重复合索引:
> db.client_words.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "test1.client_words",
"name" : "_id_"
},
{
"v" : 1,
"key" : {
"client_id" : 1,
"text" : 1
},
"unique" : true,
"ns" : "test1.client_words",
"name" : "client_id_1_text_1"
}
]
我的测试插入了 100.000 个文档:
public void test(){
int size = 10;
List<ObjectId> clientIds = createClientIds(size);
t1 = t2 = t3 = new Date();
printWithTime("Inserting... ");
for (int i=0; i<10000; i++){
for (ObjectId id : clientIds){
mongoTemplate.upsert(
Query.query(Criteria.where("text").is("text"+i).and("client_id").is(id)),
Update.update("text","text"+i).set("client_id",id).inc("value", 3),
ClientWord.class);
}
if(i%100 == 0){
System.out.printf("\t%6d\t",i*size);
printWithTime("");
}
}
printWithTime("Total time: ");
System.out.println("Total elements in the ddbb: "+mongoTemplate.count(new Query(), ClientWord.class));
}
我已经用正常和上限的集合尝试了这个代码。正常情况下需要 10 多分钟,上限为 20 秒。我还发现 capped 进行恒定时间插入,而普通集合在集合增长时需要越来越长的时间,我猜是因为索引大小但两个集合具有相同的索引......
谁能解释一下为什么有这么大的区别?有什么技巧可以提高正常的收集性能?