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

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

原文发布于微信公众号 - 马哥Linux运维(magedu-Linux)

原文发表时间:2014-08-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一个爱吃西瓜的程序员

学习SQL【2】-数据库与SQL

一:数据库是什么? 1:定义 ● 将大量数据通过计算机加工而成的可以进行高效访问的数据集合称为数据库(DB)。 ● 用来管理数据库的计算机系统称为数据库管理系...

36990
来自专栏张善友的专栏

SQL SERVER 2008 Hierarchyid数据类型

以往我们在关系数据库中建立树状结构的时候,通常使用ID+ParentID来实现两条纪录间的父子关系。但这种方式只能标示其相对位置。解决这类问题在SqlServe...

256100
来自专栏各种机器学习基础算法

常用但容易忘记的sql语句(sql server为主)

1.说明:随机取出10条数据 a.Sql Server: select top 10 * from tablename order by newid() b....

30690
来自专栏JMCui

MongoDB系列四(索引).

一、索引简介     再来老生常谈一番,什么是索引呢?数据库索引与书籍的索引类似。有了索引就不需要翻整本书,数据库可以直接在索引中查找,在索引中找到条目以后,就...

32650
来自专栏Java后端技术栈

面试中有哪些经典的数据库问题?

1、如果我们定义了主键(PRIMARY KEY),那么InnoDB会选择主键作为聚集索引、如果没有显式定义主键,则InnoDB会选择第一个不包含有NULL值的唯...

13810
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第六天 MySQL回顾学习

数据库就是存储数据的仓库,其本质是一个文件系统,数据按照特定的格式将数据存储起来,用户可以通过sql语句对数据库中的数据进行增加,修改,删除及查询操作

12520
来自专栏一“技”之长

SQLite数据库常用语句及MAC上的SQLite可视化工具MeasSQLlite使用

        在移动开发中,通常会用到一些小型的数据库进行数据管理。SQLite是一款十分小巧便捷的数据库,在iOS开发中,原生框架也对其有很好的支持。

12050
来自专栏pangguoming

MySQL命名、设计及使用规范--------来自标点符的《MySQL命名、设计及使用规范》

60820
来自专栏Kevin-ZhangCG

数据库索引

索引就是加快检索表中数据的方法。数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库...

12400
来自专栏性能与架构

MySQL 清除表空间碎片

表的存储会出现碎片化,每当删除了一行内容,该段空间就会变为空白 当执行插入操作时,MySQL会尝试使用空白空间,但如果某个空白空间一直没有被大小合适的数据占用...

38070

扫码关注云+社区

领取腾讯云代金券