user1={ name : liming , age :20, gender : F } { name : liming , age : 20, gen..."/>
溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MongoDB索引管理——創(chuàng)建索引,查看索引,刪除索引,重建

發(fā)布時間:2020-03-26 16:17:32 來源:網(wǎng)絡(luò) 閱讀:166 作者:emma_cql 欄目:MongoDB數(shù)據(jù)庫

先給users集合插入兩條記錄,然后用users集合來進行索引管理的演示:

> 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

創(chuàng)建索引:

mongodb使用createIndex()和ensureIndex()方法來創(chuàng)建索引,前者用于3.0及以上版本,后者用于3.0以下版本。
語法:
db.COLLECTION_NAME.ensureIndex(keys[,options])
keys:要建立索引的參數(shù)列表。如:{KEY:1},其中key表示字段名,1表示升序排序,也可使用使用數(shù)字-1降序。
options:可選參數(shù),表示建立索引的設(shè)置??蛇x值如下:
background,Boolean,在后臺建立索引,以便建立索引時不阻止其他數(shù)據(jù)庫活動。默認(rèn)值為false。
unique,Boolean,創(chuàng)建唯一索引。默認(rèn)值 false。
name,String,指定索引的名稱。如果未指定,MongoDB會生成一個索引字段的名稱和排序順序串聯(lián)。
partialFilterExpression, document.如果指定,MongoDB只會給滿足過濾表達式的記錄建立索引.
sparse,Boolean,對文檔中不存在的字段數(shù)據(jù)不啟用索引。默認(rèn)值是 false。
expireAfterSeconds,integer,指定索引的過期時間
storageEngine,document,允許用戶配置索引的存儲引擎

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

例2:給name字段創(chuàng)建倒序索引

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

例3:給name,age字段創(chuàng)建組合索引

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

例4:在后臺給age字段創(chuàng)建索引

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

在后臺創(chuàng)建索引的原因:
在前臺創(chuàng)建索引期間會鎖定數(shù)據(jù)庫,會導(dǎo)致其它操作無法進行數(shù)據(jù)讀寫,在后臺創(chuàng)建索引是,會定期釋放寫鎖,從而保證其它操作的運行,但是后臺操作會在耗時更長,尤其是在頻繁進行寫入的服務(wù)器上。

查看索引:

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()的用法

> 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的索引全部刪除了,現(xiàn)在在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"
    }
]
向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI