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
要分2部分解释:如果使用了索引,是扫描的索引条目;否则就是扫描的文档总数
nscannedObjects---mongodb完成这个查询扫描的文档总数。
isMultiKye---是否使用了多键索引
millis显示的是这个查询耗费的毫秒数。
n显示了查询结果的数量。
scanAndOrder---表明是否需要在内存中排序!
nYields---为了让写入请求能够顺利执行,本次查询暂停的次数!
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}来使用!
11 一个索引中的数组字段最多只能有1个
这是为了防止索引爆炸!
另外对数组建立索引,实际上是对数组中的每个元素建立索引!而不是对数组本身建立索引!
12 多键索引
其实就是说索引的某个key是一个数组
多键索引无法转换成非多键索引,即便文档都已经删除,只有删除索引重新建立才可以!
13关于复合索引
一般来说,前面的应该是基数比较大的键,后面依次降低
因为这样的话,第一个键就可以大量减少文档数量!
14 强制全表扫描
.hint({"$natural":1})
15 创建唯一索引
db.user.ensureIndex({"username":1},{"unique":true})
超过8KB的键不会受到唯一索引的约束
16 创建复合唯一索引
你懂的,不解释!
-------------------------
广告时间:日子真TM苦逼,生病了还要看书,
就为了多赚两毛5分钱!、
------------------------
17 针对唯一索引,又想添加重复的键
db.user.ensureIndex({"username":1},{"unique":true,"dropDups":true})
18 唯一索引与null
如果是唯一索引,则他会把null看做是一个值且必须唯一。
如果你想改变这个情况,可以用下面的方式:
19 稀疏索引
db.ensureIndex({"email":1}, {"unique":true,"sparse":true})
意思是说,不存在也就罢了,存在一定要唯一,包括null!
注意,如果某个文档没有email字段,而又建立了稀疏索引
则这个文档不会在索引中存在,则你搜索的时候,是不会搜到这个文档的
mongoDB怎么这么多变态的东西!真是个大坑!
20 索引管理
所有的数据库索引信息都存储在system.indexes集合里。
这是一个保留集合,不能对其进行增加修改删除,只能通过
ensureIndex和dropIndexes进行操作!
dropIndex(...)