MongoDB 1000 WレベルデータInsertとQueryとDeleteの性能テスト(それぞれインデックス付けなしとインデックス付けをテスト)

6973 ワード

まず、試験機の性能(64 bit)を見てみましょう.
^_^[root@:~]#grep "model name" /proc/cpuinfo | cut -f2 -d:
 Intel(R) Xeon(R) CPU           E5606  @ 2.13GHz
 Intel(R) Xeon(R) CPU           E5606  @ 2.13GHz
 Intel(R) Xeon(R) CPU           E5606  @ 2.13GHz
 Intel(R) Xeon(R) CPU           E5606  @ 2.13GHz
 Intel(R) Xeon(R) CPU           E5606  @ 2.13GHz
 Intel(R) Xeon(R) CPU           E5606  @ 2.13GHz
 Intel(R) Xeon(R) CPU           E5606  @ 2.13GHz
 Intel(R) Xeon(R) CPU           E5606  @ 2.13GHz
^_^[root@:~]#grep MemTotal /proc/meminfo
MemTotal:      4040580 kB
^_^[root@:~]# free -m
             total       used       free     shared    buffers     cached
Mem:          3945       3715        230          0         40       2626
-/+ buffers/cache:       1048       2897
Swap:         4094          2       4092
^_^[root@:~]#getconf LONG_BIT
64
^_^[root@:~]#more /etc/redhat-release
Red Hat Enterprise Linux Server release 5.5 (Tikanga)
^_^[root@:~]#uname -r
2.6.18-194.el5

試験手順:
#include <iostream>
#include <mongo/client/dbclient.h>
using namespace std;
using namespace mongo;

#define INIT_TIME \
        struct timeval time1,time2; \

#define START_TIME \
        gettimeofday(&time1,NULL); \

#define STOP_TIME \
        gettimeofday(&time2,NULL); \

#define PRINT_TIME \
        cout<<"Time:"<<time2.tv_sec-time1.tv_sec<<":"<<time2.tv_usec-time1.tv_usec<<endl;

int main() {
        srand(time(NULL));
        char ar[26+1];
        DBClientConnection conn;
        conn.connect("localhost");
        cout<<"MongoDB Connected OK!"<<endl;
        int count=10000000;
        INIT_TIME;
        START_TIME;
//insert
#if 1
        while (count--) {
                for (int i=0; i<26; i++) {
                        ar[i] = rand()%26+97;
                }
                ar[26]='\0';
                BSONObj p = BSON("NewsId"<<ar);
                conn.insert("test.users",p);
        }
#endif

        STOP_TIME;
        PRINT_TIME;
        return 0;
}

インデックスなしテスト:
......................# MongoDBは1000 W本のテスト#をインデックスなしに挿入する...................
^_^[root@:~/svn/nugget/MongoDB/utest]#./insertData              
MongoDB Connected OK!
Time:207s:194125μs

......................# MongoDBインデックスなし1000 Wパス遍歴テスト#............
MongoDBをすべて巡回させます.
テストデータを逆順にして、逆順の最初のデータを取ります.
> db.users.find().sort({'_id':-1})
{ "_id" : ObjectId("4e2cbdf4a1ca039d82214e33"), "NewsId" : "dgvshdhevmjgunvbepgdkzirqk" }

最初のデータのNewsIdは
dgvshdhevmjgunvbepgdkzirqk
試験手順:
^_^[root@:/usr/local/mongodb/bin]#./mongo<bat.js 
MongoDB shell version: 1.8.2
connecting to: test
> var startTime = new Date();
> 
> db.users.find({NewsId:"dgvshdhevmjgunvbepgdkzirqk"});
{ "_id" : ObjectId("4e2ccfd2a1ca039d82527b34"), "NewsId" : "dgvshdhevmjgunvbepgdkzirqk" }
> 
> (new Date().getTime()-startTime.getTime())/1000
5.846s
> bye

......................# MongoDBインデックスなし1000 W条削除テスト#......
^_^[root@:/usr/local/mongodb/bin]#./mongo 10.7.3.228 < bat.js
MongoDB shell version: 1.8.2
connecting to: 10.7.3.228/test
> var startTime = new Date();  
> //db.users.find({NewsId:"csgsqdglbyfuwdjfkkrxgzyacc"});  
> db.users.remove()
> (new Date().getTime()-startTime.getTime())/1000 
103.924
> bye

......................# MongoDB索引なし1000 W条削除最後の試験#..................
^_^[root@:/usr/local/mongodb/bin]#./mongo 10.7.3.228 < bat.js
MongoDB shell version: 1.8.2
connecting to: 10.7.3.228/test
> var startTime = new Date();  
> //db.users.find({NewsId:"csgsqdglbyfuwdjfkkrxgzyacc"});  
> db.users.remove({"NewsId":"nmffcewwjvbhjfyagfxlifgiud"})
> (new Date().getTime()-startTime.getTime())/1000 
3.991
> bye

索引付けテスト:
> db.users.getIndexes()
[
        {
                "name" : "_id_",
                "ns" : "test.users",
                "key" : {
                        "_id" : 1
                },
                "v" : 0
        }
]
> db.users.ensureIndex({NewsId:1})
> db.users.getIndexes()           
[
        {
                "name" : "_id_",
                "ns" : "test.users",
                "key" : {
                        "_id" : 1
                },
                "v" : 0
        },
        {
                "_id" : ObjectId("4e2cc408572ff09d98851cb7"),
                "ns" : "test.users",
                "key" : {
                        "NewsId" : 1
                },
                "name" : "NewsId_1",
                "v" : 0
        }
]

......................# MongoDBプラスインデックス挿入1000 W条テスト#.................
^_^[root@:~/svn/nugget/MongoDB/utest]#./insertData 
MongoDB Connected OK!
Time:2019s:19419μs

......................# MongoDBプラスインデックス1000 W条テスト遍歴テスト#............
同じように最後のデータを取り出し、パフォーマンスを見てみましょう.
^_^[root@:/usr/local/mongodb/bin]#./mongo <bat.js 
MongoDB shell version: 1.8.2
connecting to: test
> var startTime = new Date();
> 
> db.users.find({NewsId:"nxuvdqtjrrptoyildolesbkqmd"});
{ "_id" : ObjectId("4e2ccc2ea1ca039d82b9e4b3"), "NewsId" : "nxuvdqtjrrptoyildolesbkqmd" }
> 
> (new Date().getTime()-startTime.getTime())/1000
0.022s
> bye

......................# MongoDBプラス索引削除1000 W条試験#.................
^_^[root@:/usr/local/mongodb/bin]#./mongo 10.7.3.228 < bat.js
MongoDB shell version: 1.8.2
connecting to: 10.7.3.228/test
> var startTime = new Date();  
> //db.users.find({NewsId:"csgsqdglbyfuwdjfkkrxgzyacc"});  
> db.users.remove()
> (new Date().getTime()-startTime.getTime())/1000 
570.782
> bye

......................# MongoDBプラスインデックス1000 Wでテスト#を削除します.
^_^[root@:/usr/local/mongodb/bin]#./mongo 10.7.3.228 < bat.js
MongoDB shell version: 1.8.2
connecting to: 10.7.3.228/test
> var startTime = new Date();  
> //db.users.find({NewsId:"csgsqdglbyfuwdjfkkrxgzyacc"});  
> db.users.remove({"NewsId":"cikjwikamhtixoykrrfjnepkwu"})
> (new Date().getTime()-startTime.getTime())/1000 
0.025
> bye

テストデータをまとめましょう.
インデックスなしで1千万レコードを追加するTime:207 s:194125μs   
クエリ5.846 s
すべて削除103.94 s
最後の3.991 sを削除
インデックス付き1千万レコードを追加Time:2019 s:19419μs 
クエリ0.022 s
すべて削除570.782 s
最後の0.025 sを削除
MongoDBバージョン1.6のテスト
テキストリンク:http://blog.csdn.net/crazyjixiang/article/details/6630624