1

我一直在玩 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 进行恒定时间插入,而普通集合在集合增长时需要越来越长的时间,我猜是因为索引大小但两个集合具有相同的索引......

谁能解释一下为什么有这么大的区别?有什么技巧可以提高正常的收集性能?

4

0 回答 0