1. 程式人生 > >MongoDB的索引

MongoDB的索引

什麽 語法 dia 毫秒 cti 需要 大數據量 mce ges

  一、索引的概念

  相信大家對索引都不陌生,數據庫的索引類似書籍的目錄索引一樣,有了索引,看書的時候就不用翻遍整本書,就可以根據目錄頁數直接跳轉到目標內容,提高閱讀和查詢效率。數據庫的索引也是如此,它的作用就是用來提升查詢速度的,有了索引,MongoDB查詢的時候就可以索引中找到條目後,直接跳轉到目標collection的位置。

  二、默認索引

  檢索系統索引時,可以發現,mongodb默認的為每個集合都建立了默認的"_id"索引,作為檢索時參照的索引。即我們平時的find操作都是默認根據"_id"這個索引來查找的。

> db.system.indexes.find();
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "kaiye.c1", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "kaiye.c2", "name" : "_id_" }
{ "v" : 1, "key" : { "_id" : 1 }, "ns" : "kaiye.c3", "name" : "_id_" }

  三、為什麽要建自定義索引

    先往一集合c4中添加一百萬條數據,後檢索age=100的那條數據,並調用explain函數計算檢索過程中信息,發現在無排序,無自定義索引的情況下,沒查詢一條數據,需要掃描一百萬條數據,並且只是一個簡單查詢就耗費了546毫秒,這在大數據量的業務系統中是難以接受的。

    for(var i=0;i<1000000;i++){
      db.c4.insert({name:"diao",age:i})

    }

    技術分享

  四、自定義索引有無的對比

    首先為c4集合的name字段建立索引,關鍵字為ensureIndex,語法為db.c4.ensureIndex({age:1}),之後再執行查詢age=100的操作,檢索信息如下圖

    此時可以發現,在為age字段建立索引後進行一次簡單的查詢,此時遍歷的條數只有一條,並且耗時幾乎為0,相比無索引的檢索,效果可見一般。

    技術分享

   四、對索引的其他操作

     (1)查詢索引的相關信息:db.集合.stats();

     (2)刪除索引: db.集合.dropIndex({索引字段:1})

       刪除集合,也會將集合中的索引全部刪除

     (3)建立唯一索引:唯一索引的意思是,當某一字段被設置為唯一索引後,該字段在所在集合中,不允許有相同的值存在,即值是唯一的,比如以上案例,再插入age=100的一條文檔,則會有報錯信息出來了。

       語法:db.集合.ensureIndex({age:1},{unique:true})

MongoDB的索引