1 查看查询计划
db.user.find({"username":"xxx"}) .explain()
db.doc.find({"es_y":"2014"}).explain()
{
"cursor" : "BasicCursor",
"isMultiKey" : false,
"n" : 0,
"nscannedObjects" : 1,
"nscanned" : 1,
"nscannedObjectsAllPlans" : 1,
"nscannedAllPlans" : 1,
"scanAndOrder" : false,
"indexOnly" : false,
"nYields" : 0,
"nChunkSkips" : 0,
"millis" : 0,
"server" : "idc254:27017",
"filterSet" : false
}
--------
indexOnly---表明是否只用索引就可以返回所需的字段,而不是二次根据地址取文档!
cursor表明是否用了索引
nscanned是mongodb完成这个查询扫描的文档总数。
millis显示的是这个查询耗费的毫秒数。
n显示了查询结果的数量。
scanAndOrder---表明是否需要在内存中排序!
2 建立索引
db.user.ensureIndex({"username":1})
3 查询某个集合的所有索引
db.doc.getIndexes()
4 查看当前服务器的操作
db.currentOp()
{
"inprog" : [
{
"opid" : 486,
"active" : true,
"secs_running" : 2,
"op" : "getmore",
"ns" : "local.oplog.rs",
"query" : {
},
"client" : "192.168.56.66:37299",
"desc" : "conn2",
"threadId" : "0x7f1e191d7700",
"connectionId" : 2,
"waitingForLock" : false,
"numYields" : 0,
"lockStats" : {
"timeLockedMicros" : {
"r" : NumberLong(89),
"w" : NumberLong(0)
},
"timeAcquiringMicros" : {
"r" : NumberLong(15),
"w" : NumberLong(0)
}
}
}
]
}
5 关于索引
对于写操作时间慢,一个集合最多64个索引,通常不要超过2个以上的索引个数!
6 创建复合索引
db.user.ensureIndex({"key1":1,"key2":1})
7 内存排序
如果需要在内存中排序,且超过32MB.
就会报错!
8 强制指定索引进行查询
.hint({索引。。。})
9覆盖索引
简单来说,就是索引的字段已经可以满足需求,不需要再二次根据地址取文档!
10隐式索引
比如说 {"age":1,"username":1}可以当做{"age":1}来使用!