走進MongoDB(三)---- 索引

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的值進行升序排序。第二步、索引按照scoreuserid值相同的區域內進行降序排序。

 

複合索引除了支持與全部索引字段匹配的查詢外,還支持與索引字段前綴匹配的查詢。即便用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 version2Mongodb3.2開始支持version3

2d球面索引,使用球面幾何學進行查詢計算。MongoDB進行查詢包含、交集和鄰近等地理空間操做。

2dsphere indexes支持將數據存儲爲GeoJSON對象。

默認使用WGS84座標系統進行計算。

2dshpere中增長的GeoJSON對象支持:multipointmultiLineStringMultiPolygonGeometryCollection

地理索引不支持覆蓋查詢

 

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

Point2.4

指定geojson point : { type: "Point", coordinates: [ 40, 5 ] }

LineString2.4

指定geojson linestring: { type: "LineString", coordinates: [ [ 40, 5 ], [ 41, 6 ] ] }

polygon2.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可使用兩個索引的交集完成查詢。使用複合索引仍是索引交點取決於具體的查詢和系統。

在名稱爲orderscollection上常建立兩個索引

{ qty: 1 }

{ item: 1 }

使用兩個索引的交集進行查詢:

db.orders.find( { item: "abc123", qty: { $gt: 15 } } )

 

限制

有一些用於索引的限制,例如:索引鍵的長度或每一個集合的索引數。

相關文章
相關標籤/搜索