前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MongoDB权威指南学习笔记5---索引相关的知识点

MongoDB权威指南学习笔记5---索引相关的知识点

作者头像
小小科
发布2018-05-02 16:19:20
5460
发布2018-05-02 16:19:20
举报
文章被收录于专栏:北京马哥教育北京马哥教育

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(...)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2014-08-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 马哥Linux运维 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档