對於數據庫而言,無非就是增刪改查,通常我們在項目應用中,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的主從復制