索引是對資料庫表中一列或多列的值進行排序的一種結構,可以讓我們查詢資料庫變得 更快。MongoDB 的索引幾乎與傳統的關係型資料庫一模一樣,這其中也包括一些基本的查詢優化技巧。 增加檢索的效率. mongodb提供了索引的支持.(越來越傾向於關係型資料庫) 通常建立索引的, 基本要求, 就是文檔的結 ...
索引是對資料庫表中一列或多列的值進行排序的一種結構,可以讓我們查詢資料庫變得 更快。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)在做排序工作的時候如果是超大數據量也可以考慮加上索引用來提高排序的性能。