1. 程式人生 > 實用技巧 >MongoDB索引(7)

MongoDB索引(7)

索引是對資料庫表中一列或多列的值進行排序的一種結構,可以讓我們查詢資料庫變得 更快。MongoDB 的索引幾乎與傳統的關係型資料庫一模一樣,這其中也包括一些基本的查詢優化技巧。

增加檢索的效率. mongodb提供了索引的支援.(越來越傾向於關係型資料庫)

通常建立索引的, 基本要求, 就是文件的結構要儘可能一致.

普通單列索引

語法:

db.集合名.ensureIndex({鍵名:1}) # 1是升序 -1是降序

測試程式碼:

for(var i = 0; i < 200000; i++) {
    db.golang.insert({name:"bashlog"+i, age:i})
}

第一:先檢驗一下查詢效能

var start = new Date()
db.golang.find({name:"bashlog187654"})
var end = new Date()
end - start

第二:為name建立索引

db.golang.ensureIndex({name:1})

第三:再執行第一部分的查詢程式碼可以看出有數量級的效能提升

多列索引(複合索引)

語法:

db.集合名.ensureIndex({field1:1/-1, field2:1/-1})

對name和age建立複合索引

可以使用getIndexes()檢視索引的建立情況

該索引被建立後,基於 username 和 age 的查詢將會用到該索引,或者是基於 username 的查詢也會用到該索引,但是隻是基於 age 的查詢將不會用到該複合索引。因此可以說, 如果想用到複合索引,必須在查詢條件中包含複合索引中的前 N 個索引列。

子文件索引

語法:

db.集合名.ensureIndex({field.subfield:1/-1})

示例:

有如下結構的文件

{name:"諾基亞手機1", price:12.34, desc:{weight:100, area:"lundon"}}
{name:"諾基亞手機2", price:43.21, desc:{weight:200, area:"newYork"}}

要查詢weight等於100的文件

db.goods.find({'desc.weight':100})

根據當前示例,我們建立子文件

db.集合名.ensureIndex({'desc.weight':1})

唯一索引

當給某個列添加了唯一索引後,那麼這一列的資料就必須是唯一的,如果新增重複資料就回到值報錯

語法:

db.集合名.ensureIndex({name:-1},{unique:true})

檢視索引

常用命令:

(1)檢視當前索引狀態:

db.集合名.getIndexes()

(2)詳情檢視本次查詢使用哪個索引和查詢資料的狀態資訊。

explain("executionStats")

有索引時,查詢時間

刪除索引時查詢時間

刪除索引

刪除單個索引

語法:

db.集合名.dropIndex({field:1/-1})

刪除所有索引

語法:

db.集合名.dropIndexes()

注意:在刪除所有的索引是,逐漸索引會保留。

重建索引

一個表經過多次修改後,導致表的檔案產生空洞,所以檔案也是如此。可以通過索引的重建,減少索引檔案鎖片,並提高索引的效率。

類似MySQL的optimize table 表名

語法:

db.集合名.reIndex()

索引使用注意事項

(1)建立索引的時候,注意1是正序建立索引 -1是倒序建立索引

(2)索引的建立在提高查詢效能的同時會影響插入效能,對於經常查詢少插入的文件可以考慮用索引

(3)複合索引要注意索引的先後順序。

(4)每個鍵全建立索引不一定就能提高效能,索引不是萬能的。

(5)在做排序工作的時候如果是超大資料量也可以考慮加上索引用來提高排序的效能。