LinuxEye - Linux系统教程

LinuxEye - Linux系统教程

当前位置: 主页 > 数据库 >

验证MongoDB索引的性能

时间:2013-06-30 15:10来源:wubiaoblog.com/archives/717 编辑:吴飚 点击:
MongoDB也支持索引,和众多其他数据库一样,索引可以在一定程度上提升查询的效率,同时也会降低修改的效率。 验证有索引的集合,对索引列的查询速度较快,但会影响插入和修改的性
MongoDB也支持索引,和众多其他数据库一样,索引可以在一定程度上提升查询的效率,同时也会降低修改的效率。
验证有索引的集合,对索引列的查询速度较快,但会影响插入和修改的性能

测试思路:
1、先构建两个集合,一个有自定义索引,一个没有。
2、往两个集合中插数据对比insert的性能。
3、分别从两个集合中查询数据对比select的性能。
4、分别修改两个集合中的数据对比update的性能。

采用Javascript自定义函数,或者结合explain()函数实现。

准备测试集合
> use test_index
switched to db test_index
> db
test_index
> show collections
> db.index.insert({"id":0})
> db.noindex.insert({"id":0})
> show collections
index
noindex
system.indexes
> db.index.find()
{ "_id" : ObjectId("5176ede6082a20dd9b134a36"), "id" : 0 }
> db.noindex.find()
{ "_id" : ObjectId("5176edf1082a20dd9b134a37"), "id" : 0 }
> db.index.ensureIndex({"id":1})
> db.system.indexes.find()
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test_index.index", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "test_index.noindex", "name" : "_id_" }
{ "v" : 1, "key" : { "id" : 1 }, "ns" : "test_index.index", "name" : "id_1" }
index集合中在键id上建立了索引,noindex集合则没有。
 
对比insert
var index_insert = function() {
       var  begin = new Date().getTime()
       for (var i = 1; i < 10001; i++) {
              db.index.insert({"id":i})
       }
       return new Date().getTime() - begin;
}

var noindex_insert = function() {
       var  begin = new Date().getTime()
       for (var i = 1; i < 10001; i++) {
              db.noindex.insert({"id":i})
       }
       return new Date().getTime() - begin;
}

> var index_insert = function() {
... var  begin = new Date().getTime()
... for (var i = 1; i < 10001; i++) {
... db.index.insert({"id":i})
... }
... return new Date().getTime() - begin;
... }
>
> var noindex_insert = function() {
... var  begin = new Date().getTime()
... for (var i = 1; i < 10001; i++) {
... db.noindex.insert({"id":i})
... }
... return new Date().getTime() - begin;
... }
> index_insert()
2239
> noindex_insert()
1707
> db.index.count()
10001
> db.noindex.count()
10001
插入10000条数据,有索引的情况下耗时2239ms,而没有索引的情况下耗时1707ms。

对比select
var index_select = function() {
       return db.index.find({"id":1000}).explain();
}

var noindex_select = function() {
       return db.noindex.find({"id":1000}).explain();
}

> var index_select = function() {
... return db.index.find({"id":1000}).explain();
... }
>
> var noindex_select = function() {
... return db.noindex.find({"id":1000}).explain();
... }
> index_select()
{
        "cursor" : "BtreeCursor id_1",
        "isMultiKey" : false,
        "n" : 1,
        "nscannedObjects" : 1,
        "nscanned" : 1,
        "nscannedObjectsAllPlans" : 1,
        "nscannedAllPlans" : 1,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "millis" : 0,
        "indexBounds" : {
                "id" : [
                        [
                                1000,
                                1000
                        ]
                ]
        },
        "server" : "biao.oracle.com:27017"
}
> noindex_select()
{
        "cursor" : "BasicCursor",
        "isMultiKey" : false,
        "n" : 1,
        "nscannedObjects" : 10001,
        "nscanned" : 10001,
        "nscannedObjectsAllPlans" : 10001,
        "nscannedAllPlans" : 10001,
        "scanAndOrder" : false,
        "indexOnly" : false,
        "nYields" : 0,
        "nChunkSkips" : 0,
        "millis" : 25,
        "indexBounds" : {

        },
        "server" : "biao.oracle.com:27017"
}
以索引键为查询条件查询数据时,没有索引的情况下耗时25ms,有索引时几乎是秒杀。

对比update
var index_update = function() {
       var begin = new Date().getTime()
       for (var i = 10001; i < 10011; i++) {
              db.index.update({},{"$set":{"id":i}},{multi:true});
       }
       return new Date().getTime() - begin;
}

var noindex_update = function() {
       var begin = new Date().getTime()
       for (var i = 10001; i < 10011; i++) {
              db.noindex.update({},{"$set":{"id":i}},{multi:true});
       }
       return new Date().getTime() - begin;
}

> var index_update = function() {
... var begin = new Date().getTime()
... for (var i = 10001; i < 10011; i++) {
... db.index.update({},{"$set":{"id":i}},{multi:true});
... }
...
... return new Date().getTime() - begin;
... }
>
> var noindex_update = function() {
... var begin = new Date().getTime()
... for (var i = 10001; i < 10011; i++) {
... db.noindex.update({},{"$set":{"id":i}},{multi:true});
... }
...
... return new Date().getTime() - begin;
... }
> index_update()
34
> noindex_update()
2
对集合中所有的文档修改10次,有索引的情况下耗时34ms,没有索引时耗时2ms。

综上所示,有索引的集合,对索引列的查询速度较快,但会影响插入和修改的性能

转载请保留固定链接: https://linuxeye.com/database/1796.html

------分隔线----------------------------
标签:mongodb
栏目列表
推荐内容