MongoDB:mongodb的索引操作

對於數據庫而言,無非就是增刪改查,通常我們在項目應用中,READ操作又佔50%以上的操作,客戶往往對此也比較敏感,如果在這方面,效率上處理不好,往往是要遭後人唾棄的!所以這時就需要索引來發揮作用了,下面我們先看一下索引給我們帶來的感官上的區別,然後我們再詳細說說mongodb的索引操作!

一、首先,我們向數據庫中插入10萬條數據:

for(var i=0;i<100000;i++){
	var index=parseInt(i*Math.random());
	db.person.insert({"name":"jessonlv"+i,"age":i});
}

 

然後我們查找第一萬條數據的數據,即名字爲  jessonlv10000的。注意在此之前,我們沒有爲person建立索引,另外mongodb爲我們提供了explain關鍵字,使我們可以進行分析操作。

db.person.find({"name":"jessonlv"+10000}).explain()


cursor :"BasicCursor"的意思是表查找的時候,採用的是表掃描,也就是順序查找,呵呵,順序查找。

nscanned:這個的意思是查找操作一共瀏覽了10萬的數據(文檔),也就是整個表的文檔數量。有點感覺了吧。

millis:這是我們最關心的時間了,一共用了66毫秒。湊合!有點誇張,我們可以做的更好。

二、建立索引:

建立索引
db.person.ensureIndex({"name":1})
db.person.find({"name":"jessonlv"+10000}).explain()


建立索引後,我們再對比下建立索引之前的參數值,一共查找了一個文檔,所用時間竟然是離譜的0(其實不可能是零了,只是速度太快了),至此,大家應該感受到這種冰火兩重天了吧......

三、唯一索引 

mongodb的操作是這樣的:

db.person.ensureIndex({"name":1},{"unique":true})
重複的鍵是不能插入的

四、組合索引

組合索引
db.person.insert({"name":"je","age":26,"birthday":"1986-5-4"})
db.person.insert({"name":"jes","age":26,"birthday":"1986-4-4"})
db.person.insert({"name":"jess","age":26,"birthday":"1986-3-4"})
db.person.insert({"name":"jesso","age":26,"birthday":"1986-2-4"})
db.person.insert({"name":"jessonlv","age":26,"birthday":"1986-1-4"})

建立索引:
db.person.ensureIndex({"name":1,"birthday":1})
db.person.ensureIndex({"birthday":1,"name":1})
db.person.getIndexs()


在此,我們採用查詢的時候,優化器會採用最優的索引去查詢

db.person.find({"birthday":"1986-5-4","name":"jes"}).explain()



因爲我們做查詢時,查詢優化器會使用我們建立的這些索引來創建查詢方案,如果某一個先執行完則其他查詢方案被close掉,這種方案會被mongodb保存起來,當然如果非要用自己指定的查詢方案,這也是可以的,在mongodb中給我們提供了hint方法讓我們可以暴力執行。


五、刪除索引

我們的業務需求是不斷在變化的,那麼索引也肯定要根據實際情況而改變,索引是需要維護的,需要將原有的刪除然後再建立新的索引。

db.person.dropIndexes("1")

so....over,下期我將會總結下mongodb的主從複製

原創文章,轉載請註明出處:http://blog.csdn.net/jessonlv

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