欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MongoDB的索引

 更新時(shí)間:2017年05月01日 01:26:44   投稿:mdxy-dxy  
數(shù)據(jù)庫(kù)中的索引就是用來(lái)提高查詢操作的性能,但是會(huì)影響插入、更新和刪除的效率,因?yàn)閿?shù)據(jù)庫(kù)不僅要執(zhí)行這些操作,還要負(fù)責(zé)索引的更新

1、簡(jiǎn)介

它就像是一本書(shū)的目錄,如果沒(méi)有它,我們就需要對(duì)整個(gè)書(shū)籍進(jìn)行查找來(lái)獲取需要的結(jié)果,即所說(shuō)的全盤(pán)掃描;

而有了目錄(索引)之后就可以通過(guò)它幫我們定位到目標(biāo)所在的位置,快速的獲取我們想要的結(jié)果。

2、演示

第一步,向用戶集合users中插入100W條數(shù)據(jù)

var insertUsers = function() {
  var start = new Date().getTime();
  for (var i = 1; i <= 1000000; i++) {
    db.users.insert({
      "userid": i,
      "username": "wjg" + i,
      "age": Math.floor(Math.random() * 100), //年齡為0~99的隨機(jī)整數(shù)
      "createdate": new Date()
    })
  }
  var end = new Date().getTime();
  print("插入100W條數(shù)據(jù)共耗時(shí)" + (end - start) / 1000 + "秒");
}

LZ的渣渣I3和4G內(nèi)存總共耗時(shí)了484.623秒,約8分多鐘。任務(wù)管理器里邊可以很清楚的看到當(dāng)時(shí)CPU、內(nèi)存和磁盤(pán)使用率都普遍的增高。

第二步:查詢用戶名為“wjg465413”的文檔對(duì)象

db.users.find({username:"wjg465413"}).explain("allPlansExecution")
{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "test.users",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "username" : {
                "$eq" : "wjg465413"
            }
        },
        "winningPlan" : {
            "stage" : "COLLSCAN",
            "filter" : {
                "username" : {
                    "$eq" : "wjg465413"
                }
            },
            "direction" : "forward"
        },
        "rejectedPlans" : [ ]
    },
    "executionStats" : {
        "executionSuccess" : true,
        "nReturned" : 1,
        "executionTimeMillis" : 865,
        "totalKeysExamined" : 0,
        "totalDocsExamined" : 1000000,
        "executionStages" : {
            "stage" : "COLLSCAN",
            "filter" : {
                "username" : {
                    "$eq" : "wjg465413"
                }
            },
            "nReturned" : 1,
            "executionTimeMillisEstimate" : 770,
            "works" : 1000002,
            "advanced" : 1,
            "needTime" : 1000000,
            "needFetch" : 0,
            "saveState" : 7813,
            "restoreState" : 7813,
            "isEOF" : 1,
            "invalidates" : 0,
            "direction" : "forward",
            "docsExamined" : 1000000
        },
        "allPlansExecution" : [ ]
    },
    "serverInfo" : {
        "host" : "Jack",
        "port" : 27017,
        "version" : "3.0.3",
        "gitVersion" : "b40106b36eecd1b4407eb1ad1af6bc60593c6105"
    },
    "ok" : 1
}

說(shuō)明:這里的explain方法相當(dāng)于查詢計(jì)劃,它會(huì)返回給你查詢過(guò)程的詳細(xì)信息。它的參數(shù)有三種模式:“queryPlanner”(查詢計(jì)劃[默認(rèn)])、“executionStats”(執(zhí)行狀態(tài))和“allPlansExecution”(所有執(zhí)行計(jì)劃),這里我們只關(guān)注它返回給我們的以下幾個(gè)信息。

"executionTimeMillis" : 865 //執(zhí)行的毫秒數(shù) 注:如果你是第一次執(zhí)行,可能會(huì)花費(fèi)更長(zhǎng)的時(shí)間
"totalDocsExamined" : 1000000  //共檢查的文檔數(shù)

第三步:在用戶名“username”字段上加上索引

db.users.createIndex({ "username" : 1 }) 

重新執(zhí)行上次的查詢操作

db.users.find({username:"wjg465413"}).explain("allPlansExecution")
{
    "queryPlanner" : {
        "plannerVersion" : 1,
        "namespace" : "test.users",
        "indexFilterSet" : false,
        "parsedQuery" : {
            "username" : {
                "$eq" : "wjg465413"
            }
        },
        "winningPlan" : {
            "stage" : "FETCH",
            "inputStage" : {
                "stage" : "IXSCAN",
                "keyPattern" : {
                    "username" : 1
                },
                "indexName" : "username_1",
                "isMultiKey" : false,
                "direction" : "forward",
                "indexBounds" : {
                    "username" : [
                        "[\"wjg465413\", \"wjg465413\"]"
                    ]
                }
            }
        },
        "rejectedPlans" : [ ]
    },
    "executionStats" : {
        "executionSuccess" : true,
        "nReturned" : 1,
        "executionTimeMillis" : 53,
        "totalKeysExamined" : 1,
        "totalDocsExamined" : 1,
        "executionStages" : {
            "stage" : "FETCH",
            "nReturned" : 1,
            "executionTimeMillisEstimate" : 0,
            "works" : 2,
            "advanced" : 1,
            "needTime" : 0,
            "needFetch" : 0,
            "saveState" : 0,
            "restoreState" : 0,
            "isEOF" : 1,
            "invalidates" : 0,
            "docsExamined" : 1,
            "alreadyHasObj" : 0,
            "inputStage" : {
                "stage" : "IXSCAN",
                "nReturned" : 1,
                "executionTimeMillisEstimate" : 0,
                "works" : 2,
                "advanced" : 1,
                "needTime" : 0,
                "needFetch" : 0,
                "saveState" : 0,
                "restoreState" : 0,
                "isEOF" : 1,
                "invalidates" : 0,
                "keyPattern" : {
                    "username" : 1
                },
                "indexName" : "username_1",
                "isMultiKey" : false,
                "direction" : "forward",
                "indexBounds" : {
                    "username" : [
                        "[\"wjg465413\", \"wjg465413\"]"
                    ]
                },
                "keysExamined" : 1,
                "dupsTested" : 0,
                "dupsDropped" : 0,
                "seenInvalidated" : 0,
                "matchTested" : 0
            }
        },
        "allPlansExecution" : [ ]
    },
    "serverInfo" : {
        "host" : "Jack",
        "port" : 27017,
        "version" : "3.0.3",
        "gitVersion" : "b40106b36eecd1b4407eb1ad1af6bc60593c6105"
    },
    "ok" : 1
}

可以看到兩次的查詢計(jì)劃有很大的差別,我們還是著重看下那兩個(gè)屬性值。

 "executionTimeMillis" : 53  //執(zhí)行的毫秒數(shù)

 "totalDocsExamined" : 1  //共檢查的文檔數(shù)

加過(guò)索引之后查詢這個(gè)文檔所耗費(fèi)的時(shí)間僅僅為53毫秒,并且掃描一次直接定位,性能提升了16倍??梢?jiàn)合理使用索引的重要性!

注:“_id”字段是Mongo為我們默認(rèn)添加的索引,而且是唯一索引,保證了數(shù)據(jù)的唯一性,不可以移除。另外,使用limit(1)限制查詢結(jié)果的數(shù)量也可以提高查詢速度

3、索引的類(lèi)型

a)、單一索引:可以在數(shù)據(jù)集上任意一個(gè)字段上建立索引,包括普通的屬性鍵、內(nèi)嵌文檔以及內(nèi)嵌文檔中的屬性鍵。

db.users.createIndex({ "username" : 1 })  //普通屬性鍵的索引

//假設(shè)class是一個(gè)內(nèi)嵌的文檔
db.users.createIndex({ "class" : 1 })  //內(nèi)嵌文檔的索引
 
db.users.createIndex({ "class.classname" : 1 })  //內(nèi)嵌文檔中的屬性鍵索引

索引方向:1表示升序,-1表示降序

b)、復(fù)合索引:以多個(gè)屬性鍵為基礎(chǔ)而建立得索引

db.users.createIndex({ "username" : 1, "age" : -1, "userid" : 1 })  //在“username”、“age”和“userid”上建立復(fù)合索引

索引前綴:通過(guò)建立上邊的復(fù)合索引之后,Mongo就相當(dāng)于同時(shí)擁有了三個(gè)索引一樣,分別是{"username" : 1},{"username" : 1, "age" : -1}和{"username" : 1, "age" : -1, "userid" : 1},但是像{"age" : -1},{"userid" : 1}或者{"age" : -1, "userid" : 1}這三個(gè)索引并不會(huì)起作用。所以它會(huì)使用包含了前綴(首個(gè))的索引的作為復(fù)合索引

c)、多鍵索引:為數(shù)組中的多個(gè)值建立索引以實(shí)現(xiàn)高效查詢。

注:Ⅰ、不允許在多個(gè)數(shù)組上建立復(fù)合索引

 ?、颉⒉荒苤付ㄆI作為多鍵索引

 ?、?、哈希索引不能是多鍵

  Ⅳ、多鍵索引不支持覆蓋查詢

d)、地理空間索引和查詢:Mongo提供了兩種曲面類(lèi)型的索引:2dsphere索引和2d索引。查詢類(lèi)型包括:包含(inclusion),交叉(intersection)和接近(proximity)

e)、文本索引:用來(lái)支持查詢包含了字符串或者字符串?dāng)?shù)組的文檔

db.users.createIndex({"username" : "text"})

注:文本索引不支持排序并且一個(gè)復(fù)合文本索引不能再包含其他任何索引了

f)、哈希索引:它可以在使用了哈希片鍵進(jìn)行分片的數(shù)據(jù)集上進(jìn)行索引,支持相等查詢,但是不支持范圍查詢

 db.users.createIndex({"username" : "hashed"})

4、索引特性

a)、TTL(Time-To-Live)索引:是一種具有生命周期的索引,它允許為每一個(gè)文檔設(shè)置一個(gè)超時(shí)時(shí)間

 db.users.createIndex({ "createdate" : 1 },{ "expireAfterSecs" : 60*60*24 }) 

說(shuō)明:在“createdate”字段上建立一個(gè)TTL索引,當(dāng)這個(gè)自段存在并且是日期類(lèi)型,當(dāng)服務(wù)器時(shí)間比“createdate”字段的時(shí)間晚60*60*24秒,即24小時(shí)時(shí),文檔就會(huì)被刪除

b)、唯一索引:確保集合的每一個(gè)文檔的指定鍵都有唯一值

db.users.createIndex({"username" : 1}, {"unique" : true})

c)、稀疏索引:Mongo里邊的null會(huì)被看做值,如果有一個(gè)可能存在也可能不存在的字段,我們可以使用稀疏索引

db.users.createIndex({"age" : 1},{"sparse" : true})

4、索引操作

a)、查看所有索引

db.users.getIndexes()

b)、移除索引

db.users.dropIndex({"createdate1" : 1 })

c)、移除所有索引

db.users.dropIndexes()

d)、重建索引

db.users.reIndex()

說(shuō)明:該操作會(huì)先刪除所有索引,包括“_id”,然后重新創(chuàng)建所有索引

相關(guān)文章

  • windows7下使用MongoDB實(shí)現(xiàn)倉(cāng)儲(chǔ)設(shè)計(jì)

    windows7下使用MongoDB實(shí)現(xiàn)倉(cāng)儲(chǔ)設(shè)計(jì)

    本文給大家介紹了本人在物聯(lián)網(wǎng)環(huán)境下基于MongoDB實(shí)現(xiàn)的倉(cāng)儲(chǔ)的配置信息及具體的使用示例,非常的實(shí)用,有需要的小伙伴可以參考下
    2017-09-09
  • CentOS 6.5系統(tǒng)中使用yum安裝MongoDB 2.6 教程

    CentOS 6.5系統(tǒng)中使用yum安裝MongoDB 2.6 教程

    這篇文章主要介紹了CentOS 6.5系統(tǒng)中使用yum安裝MongoDB 2.6 教程,本文共分5個(gè)步驟完成MongoDB的安裝,需要的朋友可以參考下
    2015-01-01
  • mongoDB 多重?cái)?shù)組查詢(AngularJS綁定顯示 nodejs)

    mongoDB 多重?cái)?shù)組查詢(AngularJS綁定顯示 nodejs)

    這篇文章主要介紹了mongoDB 多重?cái)?shù)組查詢(AngularJS綁定顯示 nodejs),需要的朋友可以參考下
    2017-06-06
  • Mongodb文檔和數(shù)組的通配符索引應(yīng)用小結(jié)

    Mongodb文檔和數(shù)組的通配符索引應(yīng)用小結(jié)

    Mongodb的通配符索引,為靈活可變的Mongodb數(shù)據(jù)結(jié)構(gòu)提供了高效的查詢方法,本文結(jié)合Mongodb官方文檔,詳細(xì)介紹在嵌入式文檔和數(shù)組上,通配符索引的結(jié)構(gòu),感興趣的朋友一起看看吧
    2024-07-07
  • Centos7 yum安裝mongodb實(shí)現(xiàn)步驟詳解

    Centos7 yum安裝mongodb實(shí)現(xiàn)步驟詳解

    這篇文章主要介紹了Centos7 yum安裝mongodb實(shí)現(xiàn)步驟詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 如何為MongoDB添加分片副本集

    如何為MongoDB添加分片副本集

    這篇文章主要介紹了如何為MongoDB添加分片副本集,幫助大家更好的理解和學(xué)習(xí)使用MongoDB數(shù)據(jù)庫(kù),感興趣的朋友可以了解下
    2021-03-03
  • Mongodb 崩潰報(bào)錯(cuò) Too many open files的問(wèn)題解析

    Mongodb 崩潰報(bào)錯(cuò) Too many open files的問(wèn)題解析

    這篇文章主要介紹了Mongodb 崩潰報(bào)錯(cuò) Too many open files的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • MongoDB Map-Reduce 使用方法及原理解析

    MongoDB Map-Reduce 使用方法及原理解析

    MongoDB Map-Reduce 是一種強(qiáng)大的數(shù)據(jù)處理模式,可以用于對(duì)大量數(shù)據(jù)進(jìn)行批量處理和聚合操作,本文將詳細(xì)介紹 MongoDB Map-Reduce 的原理、使用方法和最佳實(shí)踐,需要的朋友可以參考下
    2024-07-07
  • 深入分析Mongodb數(shù)據(jù)的導(dǎo)入導(dǎo)出

    深入分析Mongodb數(shù)據(jù)的導(dǎo)入導(dǎo)出

    這幾天想著公司要用MongoDB,自然就要用到數(shù)據(jù)導(dǎo)入導(dǎo)出,就自己學(xué)習(xí)了一下。本文介紹了mongoDb導(dǎo)入導(dǎo)出數(shù)據(jù)的方法,有需要的朋友參考下。
    2015-05-05
  • MongoDB 3.6版本中bind_ip設(shè)置詳解

    MongoDB 3.6版本中bind_ip設(shè)置詳解

    這篇文章主要給大家介紹了關(guān)于MongoDB 3.6版本中bind_ip設(shè)置的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12

最新評(píng)論