標籤:執行計畫 explain mongodb 索引
1.索引的相關介紹:
monggodb的索引也是一顆平衡二叉樹,所以在傳統資料庫中的絕大部分的索引最佳化技術也是可用的.
注意:mongodb可以在任意方向上對資料進行遍曆(這點和關聯式資料庫中的索引不一樣),但這個僅限於單鍵排序,對於多鍵排序索引的方向還是比較重要的.
下面是個單鍵排序無方向性的具體的例子:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/58/D5/wKioL1S-FKuSfNiNAAL2NwS7sS0273.jpg" title="1.png" alt="wKioL1S-FKuSfNiNAAL2NwS7sS0273.jpg" />
上面是兩個查詢的執行計畫,紅色部分的參數表示,查詢是否在記憶體中有排序操作,
從上面的例子中可以很明顯的看出,無論是按照iage的降序還是升序排序,查詢都沒有在記憶體中有排序操作.
2.mongodb 中的索引類型比較多,我這裡僅僅列出比較常見的索引類型,更多的索引類型,參見http://www.cnblogs.com/xinghebuluo/archive/2011/12/19/2293043.html
唯一索引:它保證跟已有文檔的索引關鍵字重複的文檔不會被插入
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/58/D8/wKiom1S-E_Tj_LFHAAF35HMBqPM293.jpg" title="2.png" alt="wKiom1S-E_Tj_LFHAAF35HMBqPM293.jpg" />
上面的的例子中已成功建立一個唯一索引.
複合唯一索引:多個索引值組合的唯一索引。
複合唯一索引執行個體:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/58/D5/wKioL1S-FNij4wS5AAJK8IID8R4423.jpg" title="3.png" alt="wKioL1S-FNij4wS5AAJK8IID8R4423.jpg" />
建立唯一索引的注意事項:
(1)唯一索引和不存在的關鍵字:
當儲存到集合中的文檔在索引欄位沒有值的話,它的索引欄位會被賦值為null然後插入。就是說,你不可能在唯一索引中插入多個在某個索引欄位都沒有值的文檔。(多個null值被認為是相等的值)
以下執行個體在唯一索引欄位上插入多個null值報錯.
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/58/D8/wKiom1S-FBrAig-YAAMU74pKWqA513.jpg" title="4.png" alt="wKiom1S-FBrAig-YAAMU74pKWqA513.jpg" />
(2).對已經存在的重複值的欄位建立唯一索引.
如果直接建立唯一索引肯定是會報錯的.
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/58/D8/wKiom1S-FDzyFAilAAEgTGCNdoY648.jpg" title="5.png" alt="wKiom1S-FDzyFAilAAEgTGCNdoY648.jpg" />
(3).如果一定要在這樣的欄位上建立唯一索引,可以在建立唯一索引的時候指定一個關鍵字dropDups來強制建立索引.但是這種建立索引的方法會刪除集合中的資料,所以不建議使用這種方法。
使用dropDups強制建立索引範例:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/58/D5/wKioL1S-FVag8eprAAHuXAfnG7Q003.jpg" title="6.png" alt="wKioL1S-FVag8eprAAHuXAfnG7Q003.jpg" />
稀疏索引:在mongdo的集合中,每個文檔的索引值對可以不一樣(行的列數不一樣),那麼在一個索引中,欄位可能在某個文檔中,也有可能不在某個文檔中,當欄位不在某個文檔中的時候,查詢利用索引得到資料時預設情況下會將沒有這個欄位的文檔查詢出來.
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/58/D8/wKiom1S-FJHDFY6cAASlHYLKG0M542.jpg" title="7.jpg" alt="wKiom1S-FJHDFY6cAASlHYLKG0M542.jpg" />
以上執行個體中的查詢,通過索引iage 得到了資料,但是將不包含iage欄位的文檔也查詢出來了,
這個時候可以通過稀疏索引將那些沒有包含索引欄位的文檔過濾掉.
以下是一個通過稀疏索引過濾不包含索引欄位的的文檔的例子:
從執行計畫中可以看到,查詢是通過稀疏索引得到資料的,並且查詢出來的結果集中全部包含iage欄位(過濾掉了沒有包含iage的文檔).
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/58/D5/wKioL1S-FXiyBOE2AARx-3yu1BU730.jpg" title="8.png" alt="wKioL1S-FXiyBOE2AARx-3yu1BU730.jpg" />
3.索引管理:
查看制定集合下的索引資訊 :db.collection.getIndexes();
查看當前架構下的所有索引資訊 :db.system.indexes.find({});
建立索引:db.collection.ensureIndex({key:1}},{unique:true,dropDups:true});
hint({}):強制使用某個索引值(索引)
刪除索引:db.collection.dropIndexes() ,db.collection.dropIndex(index)
重建索引:db.test.reIndex()
標識索引: db.collection.ensureIndex({key:1}},{name:"Index_name"});
(1):查看指定集合的所有索引:db.colleciton.getIndexes();
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/58/D5/wKioL1S-FYfA5MyUAADZcAkoZZQ775.jpg" title="9.png" alt="wKioL1S-FYfA5MyUAADZcAkoZZQ775.jpg" />
(2)查看當前架構下的所有索引資訊 :db.system.indexes.find({});
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/58/D5/wKioL1S-FZHQOjdaAAFcTddqdi8498.jpg" title="10.png" alt="wKioL1S-FZHQOjdaAAFcTddqdi8498.jpg" />
(3)建立索引:db.collection.ensureIndex({key:1},{unique:true,dropDups:true,sparse:true})
上面是建立索引的標準文法,第二個大括弧({unique:true,dropDups:true,sparse:true})為索引型別參數。
Unique:表示唯一索引。
Sparse:表示稀疏索引.
dropDups:當索引欄位中存在重複值時,強制移除重複的文檔,該參數會遺失資料,不建議使用該參數.
(4)hint({}):強制使用某個索引值(索引)
下面執行個體中,從執行計畫可以看出,強制使用索引了。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/58/D8/wKiom1S-FMnyviNCAAOG-medeHc284.jpg" title="11.png" alt="wKiom1S-FMnyviNCAAOG-medeHc284.jpg" />
(5).刪除索引:db.collection.dropIndexes() ,db.collection.dropIndex(index)
db.collection.dropIndexes():刪除集合下面的所有索引.
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/58/D8/wKiom1S-FNSjrbcvAAEf2nz6nPU529.jpg" title="12.png" alt="wKiom1S-FNSjrbcvAAEf2nz6nPU529.jpg" />
集合test下面已經沒有可刪除的索引,_id_ 是系統內建的索引,無法手動刪除.
db.collection.dropIndex(index_name):刪除指定索引
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/58/D8/wKiom1S-FOjD4ubCAAHTBKjG_xQ103.jpg" title="13.png" alt="wKiom1S-FOjD4ubCAAHTBKjG_xQ103.jpg" />
(6).當索引效率低下的時候(可能是片段較多),就需要重建索引了。db.test.reIndex() 。
db.test.reIndex():重建索引
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/58/D5/wKioL1S-FcaA_VchAAJvwOH6paU697.jpg" title="14.png" alt="wKioL1S-FcaA_VchAAJvwOH6paU697.jpg" />
重建單個索引或是 集合下的所有索引。
4.執行計畫解讀:
正確解讀一個查詢的執行計畫是最佳化查詢的第一步,所以必須準確的讀懂查詢的執行計畫:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/58/D8/wKiom1S-FQTx3vS4AAkNXIQuIek588.jpg" title="15.png" alt="wKiom1S-FQTx3vS4AAkNXIQuIek588.jpg" />
本文出自 “SQLServer MySQL” 部落格,請務必保留此出處http://dwchaoyue.blog.51cto.com/2826417/1606208
mongodb 索引相關