1、普通單列索引

我們用如下代碼來測試:

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

第一、我們先檢驗一下查詢性能

var start=new Date()
db.java.find({name:xiao156789})
var end=new Date()
end-start
17510

第二、為 name 創建索引

> db.java.ensureIndex({name:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}

第三、再執行第一部分代碼可以看出有數量級的性能提升

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

2、多列索引(複合索引)

創建多列索引 語法:db.集合名.ensureIndex({field1:1/-1,field2:1/-1}) 對 name 和 age 建立一個複合索引,可以使用 db.集合名.getIndexes() 查看創建的索引情況

3、子文檔索引

語法: db.集合名.ensureIndex({field.subfield:1/-1}) 如下文檔可以建立子文檔索引

{name:諾基亞手機1,price:12.34,spc:{weight:100,area:紐約}}
{name:諾基亞手機2,price:42.34,spc:{weight:200,area:倫敦}}

比如要查詢 weight=100 的文檔

db.goods.find({spc.weight:100})

根據當前案例,我們建立子文檔索引

db.net.ensureIndex({spc.w:1})

4、唯一索引

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

5、查看索引

(1) 查看當前索引狀態: db.集合名.getIndexes()

(2) 詳情查看本次查詢使用哪個索引和查詢數據的狀態信息: db.集合名.find({name:xiao}).explain()

6、刪除索引

刪除單個索引: db.集合名.dropIndex({filed:1/-1})

刪除所有索引: db.集合名.dropIndexes()

7、重建索引

一個表經過很多次修改後,導致表的文件產生空洞,索引文件也如此,可以通過索引的重建,減少索引文件碎片,並提高索引的效率,類似 mysql 中的 optimize table 。

mysql 裡面使用 optimize table 語法: optimize table 表名

語法: db.集合名.reIndex()

8、索引使用注意事項

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

(2) 索引的創建在提高查詢性能的同時會影響插入性能,對於經常查詢少插入

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

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

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

作者:Angel_Kitty

鏈接:imooc.com/article/75436來源:慕課網


推薦閱讀:

如何確定自己是否適合做程序員?

半路學編程,可以成為大牛嗎?

如何使用 GitHub?

在做程序員的道路上,你掌握了什麼概念或技術使你感覺自我提升突飛猛進?

你看過/寫過哪些有意思的代碼?

如何在程序里留下彩蛋?

為什麼部分程序員下班後只關顯示器不關電腦?

有哪些好笑的關於程序員的笑話?

如何防止自己被人肉搜索到?

面試必備之樂觀鎖與悲觀鎖

慕課網:搞定計算機網路面試,看這篇就夠了(補充版)

推薦閱讀:

相关文章