mongodb(二):索引基礎知識

一、索引的作用
數據的存儲在物理上是分散的,創建索引是將一塊連續區域劃分出來存放索引,加快系統查找數據的速度。

二、索引的種類
1、_id索引,默認創建
2、單鍵索引

db.集合名.createIndex({x:1})

3、多鍵索引
插入方式同單鍵索引,區別在於該字段包不包含數組,如包含則爲多鍵索引

4、複合索引

db.集合名.createIndex({x:1,y:1})

5、過期索引,索引過期後,相應的數據會被刪除,適合存儲一些在一段時間後會失效的數據,如登錄信息和存儲日誌等

//創建索引
db.集合名.createIndex({time:1},{expireAfterSeconds:30})
//使用索引
db.集合名.insert({time:new Date()}) 

補充說明:
(1)存儲在過期索引字段的值必須是制定的時間類型,即ISODate或者ISODate數組,不能使用時間戳,否則過期刪除機制失效
(2)如果指定了ISODate數組,按最先到設定時間的日期爲刪除日期,該設定的刪除時間未必精確
(3)過期索引不能是複合索引

6、全文索引,mongodb中每個集合只允許創建一個全文索引,三種創建方式:

//單字段創建全文索引
db.集合名.createIndex({x:'test'})      
//多字段段創建全文索引
db.集合名.createIndex({x:'test',y:'test'})  
//對集合內所有字段創建全文索引  
db.集合名.createIndex({'$**':'test'})         

全文索引使用:

//全文搜索單個字符串
db.集合名.find({$text:{$search:"aa"}})        
//全文搜索多個字符串,或關係
db.集合名.find({$text:{$search:"aa bb cc"}})      
//全文搜索多個字符串,-爲不包含
db.集合名.find({$text:{$search:"aa bb -cc"}})   
//全文搜索多個字符串,與關係      
db.集合名.find({$text:{$search:"\"aa\" \"bb\" \"cc\""}})     
//全文索引相似度排序,對結果按照從高分到低分排序
db.集合名.find({$text:{$search:"aa"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}})

全文索引限制:
(1)、每次查詢,只能指定一個$text查詢
(2)、$text查詢不能出現在$nor查詢中
(3)、查詢中如果包含了$text,hint不再起作用
(4)、不支持中文

7、地理位置索引
(1)2d索引,用於存儲和查找平面上的點

//2d索引的創建
db.集合名.createIndex({w:"2d"})
//2d索引的使用
//$near: 查詢距離某個點最近的點,最多返回100個點
db.集合名.find({w:{$near:[1,1]}}) 
//$goWithin: 查詢某個形狀內的點
//查找距離[1,1]最大距離爲10的點,不支持$minDistance
db.集合名.find({w:{$near:[1,1], $maxDistance:10}}) 
// 查找在矩形[0,0] [3,3]範圍內的點
db.集合名.find({w:{$geoWithin:{$box:[[0,0],[3,3]]}}})
//查找以[0,0]爲圓心半徑爲5的園內的點
db.集合名.find({w:{$geoWithin:{$center:[[0,0],5]}}}) 
//查找以[0,0],[1,1],[4,5],[6,6]爲多邊形內的點
db.集合名.find({w:{$geoWithin:{$polygon:[[0,0],[1,1],[4,5],[6,6]]}}})  
//geoNear 查詢(可以看做是$near查詢的進化版本),它不僅支持 minDistance,而且它的返回結果多了一些數據,使用runCommand命令進行使用
db.runCommand({
                getNear:<collection>,   //指定數據集合
                near:[x,y],             //查詢座標
                minDistance:            //對2d索引無效,對2dsphere有效
                maxDistance:            //返回符合文檔最多的數量
                num:2               //返回的數量
            })
//geoNear 查詢返回結果
{
"results":[     //查詢的結果
{
"dis":  //查找到的數據與所指定查找的數據之間的距離
"obj":{}    //查找到的數據
}
],
"stats":{   //查詢的參數
"nscanned": //掃描了哪些數據
"objectsloaded":
"avgDistance":      //平均距離
"maxDistance":  //最大的距離
"time":     //花費的時間
},
"ok":
}

(2)2dsphere索引

//創建方法
db.集合名.createIndex({w: '2dsphere'})
//使用方法
//2Dsphere位置表示方式:
//GeoJSON:描述一個點,一條直線,多邊形等形狀,可支持多邊形交叉點等
//格式:{type:'', coordinates:[list]}
//GeoJSON非mongodb特有語法,不做詳細介紹

三、索引屬性

//param1是索引的值,param2是索引的屬性。
db.集合名.createIndex({param1},{param2})

重要的索引屬性:
1、名字

//指定名字,如該索引已經創建過了,指定名字不會覆蓋原有名
db.集合名.createIndex({x:1,y:2,z:3},{name:"normal_index"}) 
 //可用名字代替刪除索引
db.集合名.dropIndex("normal_index") 

2、唯一性

//唯一性
db.集合名.createIndex({x:1,y:1,z:1},{unique:true})

補充說明:
(1)、該情況下創建唯一性索引會報錯,集合中已有部分文檔某字段不重複,部分文檔不包含某字段,則創建該字段的唯一性索引會報錯,值爲null也爲重複,如再加入稀疏性屬性則不報錯
(2)、對多個字段創建唯一性索引,例如創建{x:1,y:1,z:1}索引,插入文檔時{x:1,y:1,z:1}和{x:1,y:1,z:2}不違反唯一性規則,即他們的組合在當前集合下是唯一的即可

3、稀疏性

//指定索引是否稀疏,默認不稀疏
db.集合名.createIndex({},{sparse:true/false}) 
//稀疏索引的使用
//插入兩個文檔
db.集合名.insert({"m":1})
db.集合名.insert({"n":1})

//篩選出有m字段的文檔,通過$exists可以判斷字段是否存在
db.集合名.find({m:{$exists:true}}) 

//給這個文檔的m字段創建一個稀疏索引, 第二條文檔不存在m字段,所以不會創建這個索引
db.集合名.createIndex({m:1},{sparse:true})

//如果使用稀疏索引查找不存在稀疏索引字段的文檔,mongodb則不會使用這個索引查找,例如:
 //可以查到數據
 db.集合名.find({m:{$exists:false}}) 
 //但如果我們通過hint強制使用索引,就不會查到數據了,因爲n上並沒有m字段的索引
 db.集合名.find({m:{$exists:false}}).hint("m_1")

4、是否定時刪除(過期索引),索引種類裏有介紹

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章