MongoDB索引管理——建立索引,查看索引,删除索引,重建索引

先给users集合插入两条记录,而后用users集合来进行索引管理的演示:mongodb

> user1={"name":"liming","age":20,"gender":"F"}
{ "name" : "liming", "age" : 20, "gender" : "F" }
> db.users.insert(user1)
WriteResult({ "nInserted" : 1 })
> user2={"name":"zhangsan","age":25,"gender":"F"}
{ "name" : "zhangsan", "age" : 25, "gender" : "F" }
> db.users.insert(user1)
WriteResult({ "nInserted" : 1 })
> db.users.count()
2

建立索引:

mongodb使用createIndex()和ensureIndex()方法来建立索引,前者用于3.0及以上版本,后者用于3.0如下版本。
语法:
db.COLLECTION_NAME.ensureIndex(keys[,options])
keys:要创建索引的参数列表。如:{KEY:1},其中key表示字段名,1表示升序排序,也可以使用使用数字-1降序。
options:可选参数,表示创建索引的设置。可选值以下:
background,Boolean,在后台创建索引,以便创建索引时不阻止其余数据库活动。默认值为false。
unique,Boolean,建立惟一索引。默认值 false。
name,String,指定索引的名称。若是未指定,MongoDB会生成一个索引字段的名称和排序顺序串联。
partialFilterExpression, document.若是指定,MongoDB只会给知足过滤表达式的记录创建索引.
sparse,Boolean,对文档中不存在的字段数据不启用索引。默认值是 false。
expireAfterSeconds,integer,指定索引的过时时间
storageEngine,document,容许用户配置索引的存储引擎数据库

> db.users.createIndex({"name":1})
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

例2:给name字段建立倒序索引服务器

> db.users.createIndex({"name":-1})
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 2,
    "numIndexesAfter" : 3,
    "ok" : 1
}

例3:给name,age字段建立组合索引ide

> db.users.createIndex({"name":1,"age":1})
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 3,
    "numIndexesAfter" : 4,
    "ok" : 1
}

例4:在后台给age字段建立索引spa

> db.users.createIndex({age:1},{background:1})
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 4,
    "numIndexesAfter" : 5,
    "ok" : 1
}

在后台建立索引的缘由:
在前台建立索引期间会锁定数据库,会致使其它操做没法进行数据读写,在后台建立索引是,会按期释放写锁,从而保证其它操做的运行,可是后台操做会在耗时更长,尤为是在频繁进行写入的服务器上。code

查看索引:

MongoDB提供的查看索引信息的方法:
getIndexes()方法能够用来查看集合的全部索引,
getIndexKeys()方法查看索引键。
totalIndexSize()查看集合索引的总大小,
getIndexSpecs()方法查看集合各索引的详细信息
例1: getIndexes()的用法排序

> db.users.getIndexes()
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test1.users"
    },
    {
        "v" : 1,
        "key" : {
            "name" : 1
        },
        "name" : "name_1",
        "ns" : "test1.users"
    },
    {
        "v" : 1,
        "key" : {
            "name" : -1
        },
        "name" : "name_-1",
        "ns" : "test1.users"
    },
    {
        "v" : 1,
        "key" : {
            "name" : 1,
            "age" : 1
        },
        "name" : "name_1_age_1",
        "ns" : "test1.users"
    },
    {
        "v" : 1,
        "key" : {
            "age" : 1
        },
        "name" : "age_1",
        "ns" : "test1.users",
        "background" : 1
    }
]

例2:getIndexKeys()的用法索引

> db.users.getIndexKeys()
[
    {
        "_id" : 1
    },
    {
        "name" : 1
    },
    {
        "name" : -1
    },
    {
        "name" : 1,
        "age" : 1
    },
    {
        "age" : 1
    }
]

例3:totalIndexSize()的用法文档

> db.users.totalIndexSize()
81920

例4:getIndexSpecs()的用法get

> db.users.getIndexSpecs()
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test1.users"
    },
    {
        "v" : 1,
        "key" : {
            "name" : 1
        },
        "name" : "name_1",
        "ns" : "test1.users"
    },
    {
        "v" : 1,
        "key" : {
            "name" : -1
        },
        "name" : "name_-1",
        "ns" : "test1.users"
    },
    {
        "v" : 1,
        "key" : {
            "name" : 1,
            "age" : 1
        },
        "name" : "name_1_age_1",
        "ns" : "test1.users"
    },
    {
        "v" : 1,
        "key" : {
            "age" : 1
        },
        "name" : "age_1",
        "ns" : "test1.users",
        "background" : 1
    }
]

删除索引:

再也不须要的索引,咱们能够将其删除,mongodb提供两种删除索引的方法:
dropIndex()方法用于删除指定的索引
dropIndexes()方法用于删除所有的索引
例1:dropIndex()的用法

> db.users.dropIndex("name_1")
{ "nIndexesWas" : 5, "ok" : 1 }
> db.users.dropIndex("name_1_age_1")
{ "nIndexesWas" : 4, "ok" : 1 }
> db.users.getIndexSpecs()
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test1.users"
    },
    {
        "v" : 1,
        "key" : {
            "name" : -1
        },
        "name" : "name_-1",
        "ns" : "test1.users"
    },
    {
        "v" : 1,
        "key" : {
            "age" : 1
        },
        "name" : "age_1",
        "ns" : "test1.users",
        "background" : 1
    }
]

咱们能够看到,name字段的索引和name与age字段的组合索引皆被删除

例2:dropIndexes()的用法

> db.users.dropIndexes()
{
    "nIndexesWas" : 3,
    "msg" : "non-_id indexes dropped for collection",
    "ok" : 1
}
> db.users.getIndexSpecs()
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test1.users"
    }
]

在使用了dropIndexes()方法后,咱们以前建的全部索引都被删除掉了

索引重建:

咱们以前把users的索引所有删除了,如今在name字段上创建一个正序索引,而后在name字段上重建倒序索引,能够看到重建索引是把以前name字段的索引删掉再新建一个索引的,重建以前name字段仍是只有一个索引.

> db.users.createIndex({name:1})
{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}
> db.users.getIndexSpecs()
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test1.users"
    },
    {
        "v" : 1,
        "key" : {
            "name" : 1
        },
        "name" : "name_1",
        "ns" : "test1.users"
    }
]
> db.users.reIndex({name:-1})
{
    "nIndexesWas" : 2,
    "nIndexes" : 2,
    "indexes" : [
        {
            "key" : {
                "_id" : 1
            },
            "name" : "_id_",
            "ns" : "test1.users"
        },
        {
            "key" : {
                "name" : 1
            },
            "name" : "name_1",
            "ns" : "test1.users"
        }
    ],
    "ok" : 1
}
> db.users.getIndexSpecs()
[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test1.users"
    },
    {
        "v" : 1,
        "key" : {
            "name" : 1
        },
        "name" : "name_1",
        "ns" : "test1.users"
    }
]
相关文章
相关标签/搜索