索引 ( _重點)
在任何數(shù)據(jù)庫之中,索引都是一種提升數(shù)據(jù)庫檢索性能的手段,這一點在Mongo數(shù)據(jù)庫之中同樣是存在的,
在Mongo 數(shù)據(jù)庫中 也存在2 種索引的創(chuàng)建: 1是自動創(chuàng)建, 2是手動創(chuàng)建
創(chuàng)建一個新的簡單集合
var data = [
{"name":"tom ","age":20,"sex":"男","score":100,"address":"南京市江寧區(qū)"},
{"name":"tom1","age":21,"sex":"女","score":90, "address":"南京市江寧區(qū)"},
{"name":"tom2","age":21,"sex":"女","score":80, "address":"南京市江寧區(qū)"},
{"name":"tom3","age":20,"sex":"男","score":70, "address":"南京市江寧區(qū)"},
{"name":"tom4","age":23,"sex":"男","score":100,"address":"南京市江寧區(qū)"}
]
db.infos.insert(data)
此時我們在這個集合上并沒有設(shè)置任何索引,那么下面用過getIndexes() 這個函數(shù)來觀察 infos 這個集合
查詢默認狀態(tài)下的infos集合的索引內(nèi)容
db.infos.getIndexes()
現(xiàn)在你會發(fā)現(xiàn)存在一個 " _id "列的索引內(nèi)容,但是如果想要創(chuàng)建自己的索引, 則可以使用如下的語法
語法: db.infos.createIndex({ "age" : -1}) (1: 表示索引按照升序 2: 表示降序)
db.infos.getIndexes() ( 查看索引)
db.infos.createIndex({ "age" : -1}) (創(chuàng)建索引)
db.infos.entrueIndexes({ "age" : -1}) (創(chuàng)建索引)
db.infos.dropIndexes() (刪除所有索引) _id 不能被刪除
此時并沒有設(shè)置索引的名字,所以名字是自動命名的 規(guī)則是:age_-1
針對當(dāng)前的age 字段上的索引做一個分析
db.infos.find({age:20}).explain() ( 這個函數(shù)是查看檢索模式的)
紅框表示檢索模式為 索引掃描 ( 下圖 )
image.png
不使用有索引的字段進行查詢,我們在分析一下 看看 檢索模式是什么
db.infos.find({"score":{"$gt":60}}).explain()
下面紅框表示 全表掃描
image.png
在換一種模式查找 2個條件一起查找
db.infos.find({"$and":[{age:20},{score:{"$gt":60}}]}).explain()
注意: 由于版本的不同 所以信息 也不太一樣 聽說 低版本的如果這樣查詢的話 是用的全表掃描,但是現(xiàn)在 如果這樣查詢 是用的 索引掃描 看下圖
image.png
總結(jié):
- 如果數(shù)據(jù)量不是很大的話用索引 意義就不太大
- 創(chuàng)建數(shù)據(jù)的時候最好不要使用數(shù)組的形式 直接key : value 這樣更好理解和操作
唯一索引
唯一索引的主要目的是用在摸一個字段上, 使該字段的內(nèi)容不重復(fù)
創(chuàng)建一個唯一索引
db.infos.createIndex({name:1},{'unique':true}) (后面的選項表示name上的字段絕對不允許重復(fù))
在infos 的集合里面insert 一個name 重復(fù)的數(shù)據(jù) 看看 如何
結(jié)果如何 自己查看 主要看看錯誤提示信息. 這里我就不貼圖了
唯一索引能夠保證 知道字段上的數(shù)據(jù)不會重復(fù)
過期索引
在一些程序站點會出現(xiàn)若干秒之后信息唄刪除的情況, 舉例: 手機信息驗證碼,那么在Mongo 里面就可以輕松的實現(xiàn)過期索引,但是這個時間往往不怎么準(zhǔn)確
注意設(shè)置過期索引 必須要有時間字段
db.phones.createIndex({time:1},{expireAfterSeconds:10})
var data = [
{tel:110,code:110,time:new Date()},
{tel:111,code:111,time:new Date()},
{tel:112,code:112,time:new Date()},
{tel:113,code:113,time:new Date()},
]
db.phones.insert(data);
然后不斷的查 db.phones,find() 自己計算看看是多長時間 我的大概在40秒
等到10秒以后 也不會消失. 不太準(zhǔn)確,這樣的特性在進行一些臨時保存數(shù)據(jù)的時候很有幫助,最早如果沒有Mongo這種特性.而只是使用簡單的關(guān)系型數(shù)據(jù)庫開發(fā) 那么是非常麻煩的
全文索引
在一些信息管理的平臺上經(jīng)常需要進行信息模糊查詢,最早的時候是利用了某個字段上時間的模糊查詢,但是這個時間返回的信息并不會很準(zhǔn)確,因為只能夠查A字段或者B字段,在Mongo里面實現(xiàn)了簡單的全文檢索
定義一個新的集合
var datas = [
{title:'java',centent:'自學(xué)java'},
{ title:'javascript,java',centent:'自學(xué)javascript,自學(xué)java'},
{title:'php',centent:'php,php'},
]
db.news.insert(datas)
首先你要 設(shè)置全文檢索
未完 待續(xù);
地理信息索引
地理信息索引分為2類,2D平面索引,寧外就是2DSphere球面索引,在2D索引里面基本上能夠保存的信息都是坐標(biāo),而且坐標(biāo)的就是經(jīng)緯度的坐標(biāo)
db.shop.insert({loc:[10,10]}) 存放的是經(jīng)緯度
var shop = [
{"loc":[12,12]},
{"loc":[13,15]},
{"loc":[112,122]},
{"loc":[222,322]},
]
db.shop.insert(shop)
然后為shop 這個集合定義2D 索引