for (var i=0; i<100000; i++) {
var index=parseInt(i*Math.random());
db.person.insert({"name":"jessonlv"+i, "age":i});
}
db.person.find({"name":"jessonlv10000"}).explain()
結果:cursor: "BasicCursor" (表掃描),nscanned: 100000,millis: 66。
db.person.ensureIndex({"name":1})
db.person.find({"name":"jessonlv10000"}).explain()
結果:cursor: "BtreeCursor name_1",nscanned: 1,millis: 0 (極速)。
| 類型 | 指令 | 說明 |
|---|---|---|
| 單欄 | db.coll.ensureIndex({"field":1}) | 1=升序, -1=降序 |
| 唯一 | db.coll.ensureIndex({"name":1}, {"unique":true}) | 重複鍵值拒絕寫入 |
| 複合 | db.coll.ensureIndex({"name":1, "birthday":1}) | 欄位順序影響查詢匹配 |
| 查看索引 | db.coll.getIndexes() | |
| 刪除指定 | db.coll.dropIndex("name_1") | |
| 刪除全部 | db.coll.dropIndexes() |
建立 {name:1, birthday:1} 與 {birthday:1, name:1} 兩個索引。查詢 {birthday:"1986-5-4", name:"jes"} 時,優化器自動選擇最佳索引 (掃描文件數最少者)。
db.person.find({"birthday":"1986-5-4", "name":"jes"}).hint({"birthday":1, "name":1})
db.coll.ensureIndex({"field":1}, {"background":true})
background:true 避免長時間鎖表。getIndexes() 檢視並移除未使用索引以減少寫入開銷。