在MongoDB中索引用於加速查詢。沒有索引,在查詢時,Mongo會進行collection的全documents進行掃描,以匹配到知足查詢條件的documents子集。若是創建合適的索引,使用索引進行查詢能夠極大減小掃描documetns的數量。git
索引是一種特殊的數據結構,這種結構以一種易於訪問的形式儲存collection 數據的一笑部分。索引儲存一個或幾個指定的域的值,並按域的值進行排序。索引中值的排序支持對「=」匹配和基於範圍的高效查詢操做。mongodb
Default _id Indexjson
在建立collection的時候,MongoDB會自動在_id域上建立惟一索引。_id上的索引是不能刪除的。數組
Create an index數據結構
db.collection.createIndex();ui
mongoDBs索引使用b-tree數據結構。spa
Index Typesrest
1.單字段索引對象
支持用戶在單獨的field上定義升序或降序索引。blog
對於單字段索引來講,索引排序順序是升序仍是降序都是同樣的,由於mongodb能夠沿着任一方向便利索引。
也能夠在嵌入字段或嵌入文段上創建單字段索引。
2.混合索引
即在多個字段上創建索引。
混合索引中字段的順序決定了索引結構中值的排列順序。如:{ userid: 1, score: -1 },第一步、索引按照userid的值進行升序排序。第二步、索引按照score在userid值相同的區域內進行降序排序。
複合索引除了支持與全部索引字段匹配的查詢外,還支持與索引字段前綴匹配的查詢。即便用db.col.find({userid:’cc3’})也可使用索引進行查詢。
前綴
索引前綴是索引字段從頭開始的子集,有
{ "item": 1, "location": 1, "stock": 1 }那麼此索引字段的前綴是
{ item: 1 }、{ item: 1, location: 1 }
MongoDB能夠在複合索引的前綴索引上使用索引查詢。
3.多鍵索引
多鍵索引在數組的內容域上創建索引。
如何索引的字段是一個數組,那麼mongodb會自動建立多鍵索引,不須要明確的指定多鍵索引類型。
限制
最多擁有一個值爲數組的索引,以下collection:
{ _id: 1, a: [ 1, 2 ], b: [ 1, 2 ], category: "AB - both arrays" }
建立{ a: 1, b: 1 }多鍵索引會出錯
而在如下collection上建立多鍵索引則不會出錯。
{ _id: 1, a: [1, 2], b: 1, category: "A array" }
{ _id: 2, a: 1, b: [1, 2], category: "B array" }
Shard key不能被指定爲多鍵索引
哈希索引不能是多鍵所
不支持覆蓋查詢
4.地理空間索引
爲了支持對地理空間座標數據的索引。mongoDB提供了兩個特定的索引:
2d indexes
使用二維幾何學返回結果
2dsphere indexes
概覽(基於version 2進行介紹)
Mongodb 2.6 開始支持2dsphere indexes version2,Mongodb3.2開始支持version3。
2d球面索引,使用球面幾何學進行查詢計算。MongoDB進行查詢包含、交集和鄰近等地理空間操做。
2dsphere indexes支持將數據存儲爲GeoJSON對象。
默認使用WGS84座標系統進行計算。
2dshpere中增長的GeoJSON對象支持:multipoint、multiLineString、MultiPolygon和GeometryCollection。
地理索引不支持覆蓋查詢
geoNear和$geoNear限制
geoNear命令和$geoNear聚合管道要求collection最多隻能擁有一個2dsphere 或2d 索引。這是由於geoNear命令和$geoNear聚合管道語法中都沒有位置字段的選項,若是有多個2d索引,那麼索引不知道選擇並使用哪個位置索引。
可是,地理查詢操做符($near,$geoWithin)容許collection擁有多個2dsphere/2d索引,由於這些操做符中能夠指定location字段。
Shard key 限制
不能將2dsphere索引指定爲shard key。可是能夠在分片集合的其它字段上指定地理索引。
2dsphere索引限制
2dsphere索引中必定要持有coordinate pairs 或者GeoJSON形式的幾何數據。
2dsphere索引的建立
db.collection.createIndex( { <location field> : "2dsphere" } )
混合索引的建立
db.places.createIndex( { loc : "2dsphere" , category : -1, name: 1 } )
GeoJSON 對象
overview
在document中,使用type字段指定geojson的類型,使用coordinate字段指定geojson的座標:{type:」<geotype>」,coordinate:<coordinates>},其中<coordinates>必需要使用固定的順序:longitute, latitude。
Point(2.4)
指定geojson point : { type: "Point", coordinates: [ 40, 5 ] }
LineString(2.4)
指定geojson linestring: { type: "LineString", coordinates: [ [ 40, 5 ], [ 41, 6 ] ] }
polygon(2.4)
多邊形由一個geojson 線性環形座標數組組成。閉合的lineString至少包含四個點,第一個和最後一個點具備相同的座標。
單環多邊形(不能包含內部環)
{
type: "Polygon",
coordinates: [ [ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ] ]
}
多環多邊形
--第一個環必須是外部環。
--內部環必須徹底包含在外部環裏面
--內部環之間不能相互重疊、交叉
{
type : "Polygon",
coordinates : [
[ [ 0 , 0 ] , [ 3 , 6 ] , [ 6 , 1 ] , [ 0 , 0 ] ],
[ [ 2 , 2 ] , [ 3 , 3 ] , [ 4 , 2 ] , [ 2 , 2 ] ]
]
}
MultiPoint多點(2.6)
{
type: "MultiPoint",
coordinates: [
[ -73.9580, 40.8003 ],
[ -73.9498, 40.7968 ],
[ -73.9737, 40.7648 ],
[ -73.9814, 40.7681 ]
]
}
MultiLineString多線段(2.6)
{
type: "MultiLineString",
coordinates: [
[ [ -73.96943, 40.78519 ], [ -73.96082, 40.78095 ] ],
[ [ -73.96415, 40.79229 ], [ -73.95544, 40.78854 ] ],
[ [ -73.97162, 40.78205 ], [ -73.96374, 40.77715 ] ],
[ [ -73.97880, 40.77247 ], [ -73.97036, 40.76811 ] ]
]
}
MultiPolygon多個多邊形(2.6)
{
type: "MultiPolygon",
coordinates: [
[ [ [ -73.958, 40.8003 ], [ -73.9498, 40.7968 ], [ -73.9737, 40.7648 ], [ -73.9814, 40.7681 ], [ -73.958, 40.8003 ] ] ],
[ [ [ -73.958, 40.8003 ], [ -73.9498, 40.7968 ], [ -73.9737, 40.7648 ], [ -73.958, 40.8003 ] ] ]
]
}
GeometryCollection 幾何集(2.6)
{
type: "GeometryCollection",
geometries: [
{
type: "MultiPoint",
coordinates: [
[ -73.9580, 40.8003 ],
[ -73.9498, 40.7968 ],
[ -73.9737, 40.7648 ],
[ -73.9814, 40.7681 ]
]
},
{
type: "MultiLineString",
coordinates: [
[ [ -73.96943, 40.78519 ], [ -73.96082, 40.78095 ] ],
[ [ -73.96415, 40.79229 ], [ -73.95544, 40.78854 ] ],
[ [ -73.97162, 40.78205 ], [ -73.96374, 40.77715 ] ],
[ [ -73.97880, 40.77247 ], [ -73.97036, 40.76811 ] ]
]
}
]
}
Sparse 屬性
默認具備稀疏索引的屬性(會忽略sparse :true option)。若是document沒有2dshpere索引對應的字段,mongodb也不會將此document放在index裏。
5.文本索引
用於在集合中搜索字符串文本
6.哈希索引
只支持等值匹配
索引屬性
1.惟一索引
拒絕索引字段的重複值。
2局部索引
只對經過過濾條件的documents創建索引。經過partialFilterExpression選項來指定。(只對如全部score>50的記錄創建索引)如:
db.restaurants.createIndex(
{ cuisine: 1, name: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
3.稀疏索引
使用Sparse選項控。稀疏索引會忽略不包含索引字段的document。
4.TTL索引
能夠在必定時間後自動從集合中一處document的特殊索引。
索引的使用
索引就是用來提升讀取操做的效率。
索引和比對規則
覆蓋查詢
當標準查詢與投影查詢僅僅包含索引字段的時候,MongDB會將結果直接從索引中返回,而不對collection進行掃描。
索引交點、交集
對於指定複合查詢條件的查詢,若是一個索引知足查詢條件的一部分,另外一個索引知足查詢條件的另外一部分,則MongoDB可使用兩個索引的交集完成查詢。使用複合索引仍是索引交點取決於具體的查詢和系統。
在名稱爲orders的collection上常建立兩個索引
{ qty: 1 }
{ item: 1 }
使用兩個索引的交集進行查詢:
db.orders.find( { item: "abc123", qty: { $gt: 15 } } )
限制
有一些用於索引的限制,例如:索引鍵的長度或每一個集合的索引數。