索引資訊儲存在system.indexes
建立索引:
db.c1.ensureIndex({age:1},{background:true})
1:升序 -1 :降序
background:是否後台建立索引
查詢表的索引
db.c1.getIndexes()或db.system.indexes.find()
文檔索引:即將索引建立在嵌入式文件類型的欄位上。
db.factories.insert({name:"baidu",addr:{city:"beijing",state:"BJ"}})
db.factories.ensureIndex({addr:1})
db.factories.find({addr:{city:"beijing",state:"BJ"}}) --走索引
db.factories.find({addr:{state:"BJ",city:"beijing"}}) --不走索引且查詢不出資料,因為順序不一致
複合式索引:
db.factories.ensureIndex({"addr.city":1,"addr.state":1})
db.factories.find({"addr.city":"beijing","addr.state":"BJ"}) --走索引
db.factories.find({"addr.city":"beijing"}) --走索引
db.factories.find({"addr.state":"BJ","addr.city":"beijing"}) --不走索引,因為順序不一致
唯一索引:ensureIndex加入unique:true
db.t4.ensureIndex({firstname:1,lastname:1},{unique:true})
強制使用索引:使用hint命令,並不是所有操作走索引一定快
db.t5.insert({name:"liangzhangping",age:28}) --添加資料用來測試
db.t5.ensureIndex({name:1,age:1}) --建立索引
db.t5.find({age:{$lt:30}}).explain() --查看執行計畫,看看有沒有走索引
db.t5.find({age:{$lt:30}}).hint({name:1,age:1}).explain()
刪除索引,使用dropIndex命令
1)刪除表中所有索引,比如:刪除t3表的所有索引
db.t3.dropIndexes()
2)刪除表中某一個索引,比如:刪除t4表在欄位firstname上建立的索引:
db.t4.dropIndex({firstname:1})
重建索引:使用reIndex命令,例如重建t3表上所有的索引:
db.t3.reIndex()
最佳化器:profiler,用來分析操作的時間,以便於進行調試及最佳化,資訊儲存在system.profile中,system.profile是Capped Collection
啟動profiler:
1)啟動MongoDB時加上“-profile=層級”
/app/mongo/mongodb/bin/mongod --profile=2
2)在用戶端執行db.setProfilingLevel(層級)命令,如:
PRIMARY> db.setProfilingLevel(1)
擷取當前層級:db.getProfilingLevel()
層級:
0 :不開啟
1 :紀錄慢命令
2 :紀錄所有命令
db.setProfilingLevel(1,10):紀錄執行超過10ms的操作