鄧開表同窗實戰MongoDB系列文章,很是不錯,贊!大力推薦!數據庫
本文是第6篇,主要講述MongoDB索引的介紹的使用和配置的實戰經驗,很是值得一看。數組
前面系列文章:安全
MongoDB安全實戰之Kerberos認證網絡
MongoDB Compass--MongoDB DBA必備的管理工具ide
MongoDB安全實戰之審計函數
MongoDB安全實戰之SSL協議加密工具
MongoDB安全實戰之網絡安全加固性能
1優化
一、前言加密
和關係型數據庫同樣,MongoDB的索引能夠提升查詢執行效率。索引就比如書中的目錄,能夠快速定位書中某一頁。適當的索引查詢,優化器能夠快速地返回結果集。
2
二、MongoDB支持的索引類型
在MongoDB主要支持如下幾種索引類型:
·單列索引
·複合索引
·多鍵索引
·全文索引
·地理空間索引
·哈希索引
2.1
2.1 單列索引
在MongoDB中,每一個集合都會默認建立一個惟一索引列」_id」,」_id」列是最基本的單列索引。
建立單列索引可使用如下語法:
db.collection.createIndex( { keyname : -1 } )
這裏的keyname表示鍵名;
-1表示索引值按降序排列;
1表示索引值按升序排列;
建立單列惟一索引使用如下語法:
db.collection.createIndex( {keyname : -1},{「unique」 : true})
MongoDB索引默認建立的是B樹索引。
2.2
2.2 複合索引
MongoDB支持在多列上建立索引。
建立複合索引可使用如下語法:
db.collection.createIndex( { <field1> :<type>,<field2> : <type> , ......} )
例如,集合test,記錄以下:
在name和age列建立複合索引以下:
db.test.createIndex({ 「name」 : 1, 」age」 : 1 })
注:複合索引不能包含哈希索引列。
2.3
2.3 多鍵索引
若是索引字段的值爲數組,MongoDB會建立數組中的每一個元素的索引鍵(即多鍵索引),不須要明確指定多鍵型。
和單列索引語法同樣,多鍵索引建立語法以下:
db.collection.createIndex({ <field> : <1 or -1> } )
注:哈希索引不能是多鍵。
2.4
2.4 全文索引
MongoDB提供全文索引支持文本搜索查詢字符串內容。全文索引能夠是其值爲字符串或字符串元素的數組的字段。目前,MongoDB集合最多隻支持一個全文索引。
2.4.1 全文索引版本歷史
從MongoDB 3.2開始,MongoDB全文索引默認的版本爲Version3.
從MongoDB 2.6開始使用Version 2的全文索引爲默認版本,MongoDB2.6和3.0都使用Version 2.
MongoDB 2.4則只支持Version 1的全文索引。
當建立全文索引時,想覆蓋默認版本,可使用選項{ 「2dsphereIndexVersion」 : <version> }
2.4.2 全文索引建立與索引名稱
建立全文索引語法以下:
db.collection.createIndex( { <fields> : 「text」 } )
也能夠在多列上建立全文索引:
db.collection.createIndex( { <fields1> : 「text」,<fields2> : 「text」,......} )
全文索引默認名稱爲「索引列名」加上「_text」,例如:
像上面建立的全文索引,默認的索引名稱爲content_text_name_text_sex_text。
因爲索引名稱長度的限制,以及刪除索引的方便,能夠在建立索引給索引命令。
db.test.createIndex({bigdata:」text」,」name」:」text」,」sex」:」text」},{name:」NewTextIndex」})
2.4.3 全文索引的權重
對於全文索引,索引字段的權重表示相對於全文索引中的其餘索引字段的重要性。索引列的默認權重爲1。調整索引列的權重,可使用包含weights選項的db.collection.createIndex()方法。
注:選擇權重時須要注意防止索引重建。
例子,集合blog,文檔以下:
如今,建立一個包含三個字段的全文索引,並將權重分配給兩個字段:
db.blog.createIndex(
{ content : 「text」,keywords : 「text」, about:」text」 },
{ weights : {content : 10, keywords : 5 }, name: 「TextIndex」 }
)
則全文索引有如下字段和權重:
·content權重10
·keywords權重5
·about有默認權重1
2.4.4 通配符全文索引
建立多個字段的全文索引時,還可使用通配符($**)。通配符全文索引,索引每個包含字符串數據集合中的每一個文檔。如下是建立一個全文索引使用通配符語法:
db.collection.createIndex({ 「$**」:」text」 } )
若是不肯定哪些文本字段在查詢條件中,此類索引是有用的。
2.4.5 不區分大小寫
Version 3的全文索引不區分大小寫,而早期版本的全文索引只對[A-z]不區分大小寫,對於全部其餘字符,則視爲不一樣。
2.4.6 全文索引的限制
·一個集合最多支持一個全文索引;
·在一個包含$text的查詢表達式中不能用hint()提示;
·排序操做不能從全文索引中得到排序順序;
2.4.7 存儲需求和性能成本
·全文索引能夠是大的。它們爲每個插入的文檔在每一個索引字段中包含一個惟一的索引詞。
·構建全文索引與構建一個大型多鍵索引很是類似,並且相同數據下,比構建一個簡單的有序索引要長。
·當在現有集合上構建一個大型全文索引時,確保打開的文件描述符有足夠高的限制。
·全文索引會影響插入效率,由於MongoDB必須爲每個新的源文檔的每個惟一索引詞添加索引。
2.5
2.5 地理空間索引
隨着移動設備的應用的爆發式增加,有一種查詢變得愈來愈流行:找到離當前位置最近的N個場所。MongoDB爲座標平面查詢提供了專門的索引,稱做地理空間索引。地理空間索引分2dsphere索引和2d索引。
2.5.1 2dsphere索引
2dsphere索引支持GeoJSON地理空間格式或傳統的座標對格式數據存儲。
2dsphere索引建立語法:
db.collection.createIndex({<field> : 「2dsphere」} )
這裏的field的值必須是GeoJSON對象或傳統的座標對。
例如:下面的places集合,其中loc鍵是GeoJSON格式數據。
如今loc列,建立一個2d球面索引。
db.places.createIndex( { loc : 「2dsphere」 } )
查詢離[-73.88,40.78]點(即飛機場)最近的10個文檔:
db.runCommand( { geoNear : 「places」, near : [-73.88,40.78],num : 10})
或
db.places.find( { 「loc」 : { $near : [-73.88,40.78]}}).limit(10)
注意事項:
·geoNear命令和$geoNear管道要求集合最多隻有1個2dsphere索引或2d索引;而地理空間查詢操做(例如,$near和$geoWithin)容許集合具備多個地理空間索引。
·2dsphere索引的字段必須是GeoJSON格式數據或傳統座標對格式數據。
·不能在分片的集合中使用片鍵作2dsphere索引,可是能夠在一個分片集合中,使用非片鍵列建立2dsphere索引。
2.5.2 2d索引
1) 2d索引建立語法:
db.collection.createIndex ( { <location field> : 「2d」 ,
<additionalfield> : <value> } ,
{<index-specification options> })
其中,<index-specificationoptions>選項能夠是下列可選的選項:
{ min : <lower bound> , max : <upper bound>, bits :<bit precision> }
2) 2d索引的位置範圍:
默認狀況下,2d索引假定經度和緯度,邊界爲-180到180,若是文檔中的座標數據在範圍以外,MongoDB就會返回一個錯誤。
3) 定義2d索引的位置精度:
默認狀況下,傳統座標對上的2d索引使用26位精度,大體至關於2英尺或60釐米的精確度,默認範圍-180到180。精度是衡量大小用來存儲位置數據的Geohash值位。能夠配置高達32位精度的地理空間索引。
索引精度不會影響查詢精度。實際的網格座標老是用於最終的查詢處理。下降精度的好處使插入操做使用更少空間和處理開銷較低。更高精度的一個好處是查詢掃描索引的較小部分以返回結果。
配置非默認位置精度,在建立索引時可使用位選項:
db.collection.createIndex( {<location field> : 「<indextype>」},
{ bits: <bit precision> } )
注意事項:
·geoNear命令和$geoNear管道要求集合最多隻有1個2dsphere索引或2d索引;而地理空間查詢操做(例如,$near和$geoWithin)容許集合具備多個地理空間索引。
·若是位置數據是GeoJSON格式數據對象,應使用2dsphere索引,而不是2d索引。
·一樣,能在分片的集合中使用片鍵作2d索引,可是能夠在一個分片集合中,使用非片鍵列建立2d索引。
2.6
2.6 哈希索引
1) 哈希索引的建立語法:
db.collection.createIndex({ _id : 「hashed」} )
哈希索引支持分片使用哈希片鍵。基於分片使用哈希索引的字段做爲片鍵在分片集羣分區數據。
在分片集合中,使用哈希索引做爲片鍵結果獲得更加隨機分佈的數據。
2) 哈希函數
哈希索引使用哈希函數來計算的索引字段的值的哈希。哈希函數摺疊嵌入式文檔並計算整個值的哈希值,但不支持多鍵(即數組)索引。
注意事項:
·MongoDB支持任何單一的列的哈希索引。但不支持多鍵(即數組)索引。
·不能在哈希索引列或指定哈希索引惟一約束字段上建立複合索引;可是,在同一個字段上,能夠建立哈希索引和非哈希索引。MongoDB會使用標量索引範圍查詢。