索引

索引能够提升查询的效率。没有索引,MongoDB必须扫描集合中的所有文档,才能找到匹配查询语句的文档。
索引是一种特殊的数据结构,将一小块数据集保存为容易遍历的形式。索引能够存储某种特殊字段或字段集的值,并按照索引指定的方式将字段值进行排序。
然而使用索引也是有代价的:对于添加的每一个索引,每次的插入、更新、删除都将会消耗更多的时间。这是因为当数据发生变动时,数据库不仅要更新文档,还要更新集合上的所有索引。 MongoDB限制每个集合上最多只能由64个索引。
使用索引键对文档进行排序可以提升排序的效率,因为索引键是按照一定顺序排列的,当然必须首先使用索引键进行排序时,索引才有用。

创建索引

  1. db.collection.createIndex( <keys>, <options> )

参数说明:

  • keys:希望创建索引的名称及排序方式,1 代表按升序排列;-1 代表按降序排列,格式:{key1:1,key2:-1} 如果是基于多个索引键进行排序时,要特别注意索引的排序方向,相同的排序方向可以提升排序效率,单个键排序时没有此影响
  • options可选参数

options可选参数

参数

类型

描述

background

布尔值

在后台构建索引,从而不干扰数据库的其他活动。取值为 true 时,代表在后台构建索引。默认值为 false 默认情况下MongoDB为尽可能快的创建索引,会阻塞索引针对数据库的读操作和写操作直到索引创建完成为止,可以通过设置此参数为true使数据库在创建索引的同事也能够处理数据库的读写操作。另外后台创建索引比前台创建索引要慢得多。

unique

布尔值

创建一个唯一的索引,从而当索引键匹配了索引中一个已存在值时,集合不接受文档的插入。取值为 true 代表创建唯一性索引。默认值为 false。

name

字符串

索引名称。如果未指定,MongoDB 会结合索引字段名称和排序序号,生成一个索引名称。
默认索引名称为 keyname1_dir1_keyname2_dir2...keynamen_dirn 其中keynameX是索引的键,dirX是索引的排序方向(1或-1)

sparse

布尔值

如果为 true,索引只引用带有指定字段的文档。这些索引占据的空间较小,但在一些情况下的表现也不同(特别是排序)。默认值为 false。

expireAfterSeconds

整型值

指定一个秒数值,作为 TTL 来控制 MongoDB 保持集合中文档的时间。

weights

文档

数值,范围从 1 到 99, 999。表示就字段相对于其他索引字段的重要性。

default_language

字符串

对文本索引而言,用于确定停止词列表,以及词干分析器(stemmer)与断词器(tokenizer)的规则。默认值为 english。

language_override

字符串

对文本索引而言,指定了文档所包含的字段名,该语言将覆盖默认语言。默认值为 language。

唯一索引

唯一索引可以确保集合中的每一个文档指定的键都有唯一值而符合唯一索引则可以单个键值相同,但是多个键值的组合值必须唯一

  1. db.collection.createIndex({key:1,key1:1},{unique:true})

稀疏索引

稀疏索引会跳过所有不包含被索引键的文档。这个索引之所以称为 "稀疏" 是因为它并不包括集合中的所有文档。与之相反,非稀疏的索引会索引每一篇文档,如果一篇文档不含被索引键则为它存储一个null值。
如果希望针对一个可能存在也可能不存在的字段添加唯一索引时,可以使用unique与sparse组合使用,这样就可以保障在这个字段存在时就是唯一的
当然稀疏索引也不必是唯一的只要去掉unique选项就可以了

  1. db.collection.createIndex({key:1},{sparse:true})

注意:根据是否使用稀疏索引,同一查询的返回结果可能会不同,使用稀疏索引后会过滤掉不含该稀疏索引键值的文档。

TTL索引

TTL索引,time to live index 具有生命周期的索引,这种索引允许为每个文档设置一个过期时间,当超过指定时间后,集合自动清除超时的文档
用来保存一些诸如session会话信息的时候非常有用,或者存储缓存数据使用。但删除会有延时
索引的字段必须是一个日期的 bson 类型
如果要索引的字段已经在其他索引中使用,将不能创建 TTL 索引。否则超时后文档不会被自动清除。
索引不能包含多个字段
固定集合不能创建TTL索引
不能针对已经存在TTL索引更改expireAfterSeconds的值,可以通过删除再创建的方式处理

  1. db.collection.createIndex({key:1},{expireAfterSeconds:seconds})

注意:Mongodb每分钟针对TTL进行一次清理,所以不能以秒为单位设置索引的存活状态,可以使用collMod设置expireAfterSeconds的值

  1. db.runCommand( {"collMod" : <collection> , "expireAfterSeconds" : <value> } )

全文索引

全文索引用于在文档中搜索文本,我们也可以使用正则表达式来查询字符串,但是当文本块比较大的时候,正则表达式搜索会非常慢,而且无法处理语言理解的问题(如 entry 和 entries 应该算是匹配的)。使用全文索引可以非常快地进行文本搜索,就如同内置了多种语言分词机制的支持一样。创建索引的开销都比较大,全文索引的开销更大。创建索引时,需后台或离线创建

地理空间索引

MongoDB支持几种类型的地理空间索引。其中最常用的是 2dsphere 索引(用于地球表面类型的地图)和 2d 索引(用于平面地图和时间连续的数据)

哈希索引

哈希
索引可以支持相等查询,但是
哈希
索引不支持范围查询。您可能无法创建一个带有
哈希
索引键的复合索引或者对
哈希
索引施加唯一性的限制。但是,您可以在同一个键上同时创建一个
哈希
索引和一个递增/递减(例如,非哈希)的索引,这样MongoDB对于范围查询就会自动使用非哈希的索引

局部索引

这是3.2.0版本以后新增的
只会对Collections满足条件partialFilterExpression的文档进行索引
使用该索引,会在一定程度上减少存储空间和创建索引和维护性能降低的成本

  1. db.collection.createIndex(

  1. { key: 1 },

  1. { partialFilterExpression: { key1: value } }

  1. )

删除索引

db.collection.dropIndexes()会删除当前集合中的所有索引(_id上的默认索引除外).

db.collection.dropIndex(index)可以根据指定的索引名称或索引文档删除索引(_id上的默认索引除外).

获取索引

db.collection.getIndexes() 可以获取当前集合中所有的索引信息

查询分析

$explain 操作提供的消息包括:查询消息、查询所使用的索引以及其他的统计信息。在分析索引优化方案时,这是一个非常有用的工具。

  1. db.users.find({userName:"user1001"}).explain()

查询计划详细讲解请参考

$hint操作符强制索引优化器使用指定的索引运行查询。这尤其适用于测试带有多个索引的查询性能

  1. db.users.find({userName:"user1001"}).hint({userName:1})

注意:

  • 如果有一个多键复合索引,如:{a:1,b:1,c:1...z:1}.在MongoDB中实际可以使用{a:1};{a:1,b:1};{a:1,c:1}等一系列索引,而使用{b:1};{b:1,c:1}等作为索引查询时则不会使用到之前创建的索引,因为只有使用索引前缀的查询才会被优化。
  • $exists 不会使用索引,$ne虽然使用索引但是必须检查所有的索引条目,跟不使用没什么区别 $not大部分情况下都是使用全表扫描 $nin和$in总是全表扫描 $or 可以对每个字句分别使用索引,因为$or实际是执行两次查询然后进行的结果集合并
  • 应该在索引基数比较高的键上建立索引,或至少应该把索引基数较高的键放在复合索引的前面(低基数键的前面)
    基数就是集合中某个字段拥有不同值的数量
  • 查询得到的结果集在原集合中所占比例越大,索引的速度越慢,因为使用索引是需要进行两次查找的:1.查找索引条目,2.根据索引指针查找对应的文档。而全表扫描只要进行一次查询:查询对应的文档。
    一般来说如果查询的结果集占据原集合比例的30%时,就要对比使用索引及全表扫描是的速度进行对比。

MongoDB学习笔记——索引管理的更多相关文章

  1. MongoDB学习笔记—权限管理

    1.MongoDB权限介绍 a 上篇文章中,我们在Linux下配置了MongoDB环境并且将其设置为服务随机器启动而启动,那么接下来这篇文章我们就来简单说一下MongoDB下对登录用户权限的管理. b ...

  2. MongoDB学习笔记(索引)

    一.索引基础:    MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧.下面是创建索引的命令:    > db.test.ensureIndex({" ...

  3. MongoDB学习笔记(索引)(转)

    一.索引基础:    MongoDB的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的优化技巧.下面是创建索引的命令:    > db.test.ensureIndex({" ...

  4. MongoDB学习笔记~索引提高查询效率

    回到目录 索引这个东西大家不会陌生,只要接触到稍微大一点的数据,都会用到这东西,它可以提升查询的速度,相当代价就是占用了更多的存储空间,这也是正常的,符合“能量守恒定理”,哈哈!今天说的是MongoD ...

  5. MongoDB学习笔记——集合管理

    创建集合 使用db.createCollection(name, options) 方法创建集合 name 所创建的集合名称必选! options 可选.指定有关内存大小及索引的选项 db.creat ...

  6. MongoDB学习笔记系列

    回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...

  7. MongoDB学习笔记系列~目录

    MongoDB学习笔记~环境搭建 (2015-03-30 10:34) MongoDB学习笔记~MongoDBRepository仓储的实现 (2015-04-08 12:00) MongoDB学习笔 ...

  8. mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)

    最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...

  9. MongoDB学习笔记(四)--索引 && 性能优化

    索引                                                                                             基础索引 ...

随机推荐

  1. swift webView 提出这样的要求你能忍吗?

    提出的要求是:webView字体显示大小合适,里面会有大的图片,大的表格,不能按比例缩放,可以左右滑动查看. 首先,如果要满足上面的要求需要将webView放入scrollView中显示 scroll ...

  2. AngularJS学习--- AngularJS中数据双向绑定(two-way data-binding) orderBy step4

    1.切换工作目录 git checkout step- #切换分支,切换到第4步 npm start #启动项目 2.代码 app/index.html Search: <input ng-mo ...

  3. Jar依赖很多,找不到重复的包??好工具来帮助您

    这里下载 http://download.csdn.net/download/steven2088/8563873 之前的上传错误,新url http://download.csdn.net/deta ...

  4. "2016-10-06T12:09:18.303+0800"

    Java public static void main(String[] args) throws ParseException { SimpleDateFormat sdf = new Simpl ...

  5. React Native填坑之旅--Button篇

    从React过来,发现React Native(以下简称RN)居然没有Button.隔壁的iOS是有UIButton的,隔壁的隔壁的Android里也是有的.没有Button,就没有点击效果啊.这还真 ...

  6. [原] XAF 如何基于业务规则禁用属性

    How to: Disable Property Editors Based on a Business Rule // Developer Express Code Central Example: ...

  7. Hadoop-1.2.1 安装步骤小结(ubuntu)

    1.安装ubuntu系统 如果不使用云服务器,可以使用虚拟机WmWare安装,具体安装步骤这里就不讲了,ubuntu系统下载地址:http://www.ubuntu.com/download/desk ...

  8. linux系统基础网络配置

    1.修改主机名 临时方法: 退出当前shell重新登录即可生效.此法只能临时修改生效.重启系统后失效. 提示:很多人使用hostname主机名来修改,其实这个只是作为暂时的.重启后将恢复到配置前的主机 ...

  9. 微信小程序事件始末及相关资料整理

    转载请注明来源:前端之巅 微信公众号 小道消息 昨晚(9月21日晚)10:51,冯大辉在他的知名微信公众号小道消息上发了一篇7字标题的文章<微信应用号来了>,并加了"微信是一个操 ...

  10. Windows2003 SQL2005解决系统Administrator密码不知道的问题

    Windows2003 SQL2005解决系统Administrator密码不知道的问题 今天上班的时候,有个同事说不知道谁设置了开机密码,那台电脑一直没有开机密码的他现在进不了桌面 那台电脑没有光驱 ...