溫馨提示×

溫馨提示×

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

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

MongoDB中的索引是怎樣的

發(fā)布時間:2021-09-29 10:45:39 來源:億速云 閱讀:218 作者:柒染 欄目:大數據

本篇文章給大家分享的是有關MongoDB中的索引是怎樣的,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

索引就像圖書的目錄一樣,可以讓我們快速定位到需要的內容,關系型數據庫中有索引,NoSQL中當然也有,本文我們就先來簡單介紹下MongoDB中的索引。

索引創(chuàng)建

默認情況下,集合中的_id字段就是索引,我們可以通過getIndexes()方法來查看一個集合中的索引:

db.sang_collect.getIndexes()

結果如下:

[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "sang.sang_collect"
    }
]

我們看到這里只有一個索引,就是_id。

現在我的集合中有10000個文檔,我想要查詢x為1的文檔,我的查詢操作如下:

db.sang_collect.find({x:1})

這種查詢默認情況下會做全表掃描,我們可以用上篇文章介紹的explain()來查看一下查詢計劃,如下:

db.sang_collect.find({x:1}).explain("executionStats")

結果如下:

{
    "queryPlanner" : {
    },
    "executionStats" : {
        "executionSuccess" : true,
        "nReturned" : 1,
        "executionTimeMillis" : 15,
        "totalKeysExamined" : 0,
        "totalDocsExamined" : 10000,
        "executionStages" : {
            "stage" : "COLLSCAN",
            "filter" : {
                "x" : {
                    "$eq" : 1.0
                }
            },
            "nReturned" : 1,
            "executionTimeMillisEstimate" : 29,
            "works" : 10002,
            "advanced" : 1,
            "needTime" : 10000,
            "needYield" : 0,
            "saveState" : 78,
            "restoreState" : 78,
            "isEOF" : 1,
            "invalidates" : 0,
            "direction" : "forward",
            "docsExamined" : 10000
        }
    },
    "serverInfo" : {
    },
    "ok" : 1.0
}

結果比較長,我摘取了關鍵的一部分。我們可以看到查詢方式是全表掃描,一共掃描了10000個文檔才查出來我要的結果。實際上我要的文檔就排第二個,但是系統(tǒng)不知道這個集合中一共有多少個x為1的文檔,所以會把全表掃描完,這種方式當然很低效,但是如果我加上limit,如下:

db.sang_collect.find({x:1}).limit(1)

此時再看查詢計劃發(fā)現只掃描了兩個文檔就有結果了,但是如果我要查詢x為9999的記錄,那還是得把全表掃描一遍,此時,我們就可以給該字段建立索引,索引建立方式如下:

db.sang_collect.ensureIndex({x:1})

1表示升序,-1表示降序。當我們給x字段建立索引之后,再根據x字段去查詢,速度就非??炝耍覀兛聪旅孢@個查詢操作的執(zhí)行計劃:

db.sang_collect.find({x:9999}).explain("executionStats")

這個查詢計劃過長我就不貼出來了,我們可以重點關注查詢要耗費的時間大幅度下降。

此時調用getIndexes()方法可以看到我們剛剛創(chuàng)建的索引,如下:

[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "sang.sang_collect"
    },
    {
        "v" : 2,
        "key" : {
            "x" : 1.0
        },
        "name" : "x_1",
        "ns" : "sang.sang_collect"
    }
]

我們看到每個索引都有一個名字,默認的索引名字為字段名_排序值,當然我們也可以在創(chuàng)建索引時自定義索引名字,如下:

db.sang_collect.ensureIndex({x:1},{name:"myfirstindex"})

此時創(chuàng)建好的索引如下:

{
    "v" : 2,
    "key" : {
        "x" : 1.0
    },
    "name" : "myfirstindex",
    "ns" : "sang.sang_collect"
}

當然索引在創(chuàng)建的過程中還有許多其他可選參數,如下:

db.sang_collect.ensureIndex({x:1},{name:"myfirstindex",dropDups:true,background:true,unique:true,sparse:true,v:1,weights:99999})

關于這里的參數,我說一下:

1.name表示索引的名稱
2.dropDups表示創(chuàng)建唯一性索引時如果出現重復,則將重復的刪除,只保留第一個
3.background是否在后臺創(chuàng)建索引,在后臺創(chuàng)建索引不影響數據庫當前的操作,默認為false
4.unique是否創(chuàng)建唯一索引,默認false
5.sparse對文檔中不存在的字段是否不起用索引,默認false
6.v表示索引的版本號,默認為2
7.weights表示索引的權重

此時創(chuàng)建好的索引如下:

{
    "v" : 1,
    "unique" : true,
    "key" : {
        "x" : 1.0
    },
    "name" : "myfirstindex",
    "ns" : "sang.sang_collect",
    "background" : true,
    "sparse" : true,
    "weights" : 99999.0
}

查看索引

上文我們介紹了getIndexes()可以用來查看索引,我們還可以通過totalIndexSize()來查看索引的大小,如下:

db.sang_collect.totalIndexSize()

刪除索引

我們可以按名稱刪除索引,如下:

db.sang_collect.dropIndex("xIndex")

表示刪除一個名為xIndex的索引,當然我們也可以刪除所有索引,如下:

db.sang_collect.dropIndexes()

索引是個好東西,可以有效的提高查詢速度,但是索引會降低插入、更新和刪除的速度,因為這些操作不僅要更新文檔,還要更新索引,MongoDB限制每個集合上最多有64個索引,我們在創(chuàng)建索引時要仔細斟酌索引的字段。

以上就是MongoDB中的索引是怎樣的,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

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

AI