索引支援在mongodb中高效地執行查詢。如果沒有索引,mongodb必須執行全集合掃瞄,即掃瞄集合中的每個文件。這種掃瞄全集合的查詢效率是非常低的,特別在處理大量的資料時,查詢可以要花費幾十秒甚至幾分鐘。 如果查詢存在適當的索引,mongodb可以使用該索引限制必須檢查的文件數。
索引是特殊的資料結構,它以易於遍歷的形式儲存集合資料集的一小部分。索引儲存特定欄位或一組欄位的值,按字段值排序。索引項的排序支援有效的相等匹配和基於範圍的查詢操作。此外,mongodb還可以使用索引中的排序返回排序結果。mongodb索引使用b樹資料結構(確切的說是b-tree,mysql是b+tree)
mongodb支援在文件的單個欄位上建立使用者定義的公升序/降序索引,稱為單字段索引(single field index)。
對於單個字段索引和排序操作,索引鍵的排序順序(即公升序或降序)並不重要,因為mongodb可以在任何方向上遍歷索引。
mongodb還支援多個欄位的使用者定義索引,即復合索引(compound index)。
復合索引中列出的字段順序具有重要意義。例如,如果復合索引由 組成,則索引首先按userid正序排序,然後在每個userid的值內,再在按score倒序排序。
地理空間索引(geospatial index)、文字索引(text indexes)、雜湊索引(hashed indexes)。
地理空間索引(geospatial index) 為了支援對地理空間座標資料的有效查詢,mongodb提供了兩種特殊的索引:返回結果時使用平面幾何的二維索引和返回結果時使用球面 幾何的二維球面索引。
文字索引(text indexes) mongodb提供了一種文字索引型別,支援在集合中搜尋字串內容。這些文字索引不儲存特定於語言的停止詞(例如「the」、「a」、「or」), 而將集合中的詞作為詞幹,只儲存根詞。
雜湊索引(hashed indexes) 為了支援基於雜湊的分片,mongodb提供了雜湊索引型別,它對字段值的雜湊進行索引。這些索引在其範圍內的值分布更加隨機,但只支 持相等匹配,不支援基於範圍的查詢。
//返回乙個集合中的所有索引的陣列。
db.collection.getindexes()
預設_id索引:
mongodb在建立集合的過程中,在 _id 欄位上建立乙個唯一的索引,預設名字為 _id_,該索引可防止客戶端插入兩個具有相同值的文件,不能在_id欄位上刪除此索引。
注意:該索引是唯一索引,因此值不能重複,即 _id 值不能重複的。在分片集群中,通常使用 _id 作為片鍵。
//在集合上建立索引
1)單字段索引示例
db.articles.createindex()
檢視索引
db.articles.getindexes()
[ ,
"name" : "_id_",
"ns" : "articledb.articles"},,
"name" : "userid_1",
"ns" : "articledb.articles"}]
2)復合索引:
對 userid 和 nickname 同時建立復合(compound)索引:
db.articles.createindex()
1)指定索引的移除
刪除 articles集合中 userid 欄位上的公升序索引:
db.articles.dropindex()
或者通過索引名稱刪除
db.articles.dropindex("userid_1")
2)所有索引的移除
db.articles.dropindexes()
注意: _id 的字段的索引是無法刪除的,只能刪除非 _id 欄位的索引。
分析查詢效能(analyze query performance)通常使用執行計畫(解釋計畫、explain plan)來檢視查詢的情況,如查詢耗費的時間、是否基於索引查詢等。 如果想知道建立的索引是否有效,效果如何,都需要通過執行計畫檢視。
命令:db.collection.find(query,options).explain(options)
> db.articles.find().explain()
},"winningplan" :
},"direction" : "forward"
},"rejectedplans" : [ ]
},"serverinfo" : ,
"ok" : 1
}
關鍵點看: "stage" : "collscan", 表示全集合掃瞄;"stage" : "ixscan" ,基於索引的掃瞄
當查詢條件和查詢的投影僅包含索引欄位時,mongodb直接從索引返回結果,而不掃瞄任何文件或將文件帶入記憶體。 這些覆蓋的查詢可以非常有效。
MongoDB 簡單索引操作(基礎使用)
提高資料查詢的效率,降低資料庫的io成本 通過索引對資料進行排序,降低資料排序的成本,降低cpu的消耗 占用磁碟空間 大量索引影響sql語句效率,因為每次插入和修改資料都需要更新索引 檢視索引 db.c1.getindexes 建立普通索引 db.c1.createindex 給索引起別名 db.c...
mongodb基礎索引相關內容
檢視一條集合的索引情況 db.username getindexes name id ns test.username 以username建立索引 db.username.ensureindex 然後再次檢視該集合的索引 發現索引已建立成功 db.username getindexes name i...
mongoDB 索引使用
一 索引基礎 mongodb的索引幾乎與傳統的關係型資料庫一模一樣,這其中也包括一些基本的優化技巧。下面是建立索引的命令 db.test.ensureindex 可以通過下面的名稱檢視索引是否已經成功建立 db.test.getindexes 刪除索引的命令是 db.test.dropindex 在...