您好,登錄后才能下訂單哦!
1.索引的相關介紹:
monggodb的索引也是一顆平衡二叉樹,所以在傳統數據庫中的絕大部分的索引優化技術也是可用的.
注意:mongodb可以在任意方向上對數據進行遍歷(這點和關系數據庫中的索引不一樣),但這個僅限于單鍵排序,對于多鍵排序索引的方向還是比較重要的.
下面是個單鍵排序無方向性的具體的例子:
上面是兩個查詢的執行計劃,紅色部分的參數表示,查詢是否在內存中有排序操作,
從上面的例子中可以很明顯的看出,無論是按照iage的降序還是升序排序,查詢都沒有在內存中有排序操作.
2.mongodb 中的索引類型比較多,我這里僅僅列出比較常見的索引類型,更多的索引類型,參見http://www.cnblogs.com/xinghebuluo/archive/2011/12/19/2293043.html
唯一索引:它保證跟已有文檔的索引關鍵字重復的文檔不會被插入
上面的的例子中已成功創建一個唯一索引.
復合唯一索引:多個鍵值組合的唯一索引。
復合唯一索引實例:
創建唯一索引的注意事項:
(1)唯一索引和不存在的關鍵字:
當保存到集合中的文檔在索引字段沒有值的話,它的索引字段會被賦值為null然后插入。就是說,你不可能在唯一索引中插入多個在某個索引字段都沒有值的文檔。(多個null值被認為是相等的值)
以下實例在唯一索引字段上插入多個null值報錯.
(2).對已經存在的重復值的字段創建唯一索引.
如果直接創建唯一索引肯定是會報錯的.
(3).如果一定要在這樣的字段上創建唯一索引,可以在創建唯一索引的時候指定一個關鍵字dropDups來強制創建索引.但是這種創建索引的方法會刪除集合中的數據,所以不建議使用這種方法。
使用dropDups強制創建索引范例:
稀疏索引:在mongdo的集合中,每個文檔的鍵值對可以不一樣(行的列數不一樣),那么在一個索引中,字段可能在某個文檔中,也有可能不在某個文檔中,當字段不在某個文檔中的時候,查詢利用索引得到數據時默認情況下會將沒有這個字段的文檔查詢出來.
以上實例中的查詢,通過索引iage 得到了數據,但是將不包含iage字段的文檔也查詢出來了,
這個時候可以通過稀疏索引將那些沒有包含索引字段的文檔過濾掉.
以下是一個通過稀疏索引過濾不包含索引字段的的文檔的例子:
從執行計劃中可以看到,查詢是通過稀疏索引得到數據的,并且查詢出來的結果集中全部包含iage字段(過濾掉了沒有包含iage的文檔).
3.索引管理:
查看制定集合下的索引信息 :db.collection.getIndexes();
查看當前架構下的所有索引信息 :db.system.indexes.find({});
創建索引:db.collection.ensureIndex({key:1}},{unique:true,dropDups:true});
hint({}):強制使用某個鍵值(索引)
還可以在后臺建立索引db.collection.ensureindex({someFiled:1},{background:1})
優點:定期釋放鎖,以便客服端寫入數據.
缺點:耗時較長
前臺建立索引(默認):
優點:耗時相對較少
缺點:索引創建期間客服端不能寫入數據
刪除索引:db.collection.dropIndexes() ,db.collection.dropIndex(index)
重建索引:db.test.reIndex()
標識索引: db.collection.ensureIndex({key:1}},{name:"Index_name"});
(1):查看指定集合的所有索引:db.colleciton.getIndexes();
(2)查看當前架構下的所有索引信息 :db.system.indexes.find({});
(3)創建索引:db.collection.ensureIndex({key:1},{unique:true,dropDups:true,sparse:true})
上面是創建索引的標準語法,第二個大括號({unique:true,dropDups:true,sparse:true})為索引類型參數。
Unique:表示唯一索引。
Sparse:表示稀疏索引.
dropDups:當索引字段中存在重復值時,強制刪除重復的文檔,該參數會丟失數據,不建議使用該參數.
(4)hint({}):強制使用某個鍵值(索引)
下面實例中,從執行計劃可以看出,強制使用索引了。
(5).刪除索引:db.collection.dropIndexes() ,db.collection.dropIndex(index)
db.collection.dropIndexes():刪除集合下面的所有索引.
集合test下面已經沒有可刪除的索引,_id_ 是系統自帶的索引,無法手動刪除.
db.collection.dropIndex(index_name):刪除指定索引
(6).當索引效率低下的時候(可能是碎片較多),就需要重建索引了。db.test.reIndex() 。
db.test.reIndex():重建索引
重建單個索引或是 集合下的所有索引。
4.執行計劃解讀:
正確解讀一個查詢的執行計劃是優化查詢的第一步,所以必須準確的讀懂查詢的執行計劃:
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。