2019独角兽企业重金招聘Python工程师标准>>> hot3.png

索引Indexes

索引常常用来大幅度的提升查询的性能。 考虑应用程序的查询种类是非常重要的事情,因此你就要定义相关的索引。

决定了之后,在MongoDB中创建索引是非常简单的。

基础

索引就是collection中一个document指定一个字段值的数据结构。MongoDB查询优化器可以使用这个数据结构快速分类整理以及排序document。一般来说,索引的实现是B-TREE。

在Shell中,你可以使用ensureIndex()来创建索引,并且指定要索引一个或多个字段。

我们在j字段上创建一个索引

db.things.ensureIndex({j:1});
如果索引不存在,ensureIndex就创建索引。
一旦索引被创建了,匹配索引字段的查询是非常快速的。
没有索引的话,MongoDB必须检查每个document要查询的字段。
db.things.find({j : 2}); // 快速,使用了索引。
db.things.find({x : 3});  // 慢- 检查所有的document,因为x没有被索引。

你可以使用db.things.getIndexes();来查看索引信息。

默认索引

_id字段默认被添加了索引。这个索引也不能被删除。_id索引是唯一的。Capped Collections并不会默认创建索引。

Embedded Keys

你甚至可以向embedded document的字段创建索引。例子

db.things.ensureIndex({"address.city": 1})
document做为key

索引的字段可以为任意类型,包括了document类型。

db.factories.insert( { name: "xyz", metro: { city: "New York", state: "NY" } } );
db.factories.ensureIndex( { metro : 1 } );
//这个查询可以使用上面创建的索引。
db.factories.find( { metro: { city: "New York", state: "NY" } } );
//等同于
db.factories.find( { metro: { $gte : { city: "New York" } } } );
//metro内的字段顺序错误,不能应用这个索引。
db.factories.find( { metro: { state: "NY" , city: "New York" } } );

也可以创建这个document内字段的组合索引。

db.factories.ensureIndex( { "metro.city" : 1, "metro.state" : 1 } );
//以下查询可以使用上面创建的索引。
db.factories.find( { "metro.city" : "New York", "metro.state" : "NY" } );
db.factories.find( { "metro.city" : "New York" } );
db.factories.find().sort( { "metro.city" : 1, "metro.state" : 1 } );
db.factories.find().sort( { "metro.city" : 1 } )
下面谈谈这两种方法的优劣势。
当使用整个document做为索引,顺序就默认定义了,升序。
当使用组合索引,你可以混合升序和降序的key,并且查询优化器使用该索引也需要匹配查询中的首个字段。
数组

当索引的键为数组的时候,MongoDB会索引数组中每个元素。

组合索引

除了支持单个字段的索引,MongoDB也支持索引多个字段。创建的索引地方法一样,都使用ensureIndex()。但是你可以指定多个字段。

db.things.ensureIndex({j:1, name:-1});

当创建索引的时候,上面的数字1和-1代表着索引的方向。1是升序,-1为降序。如果为单个索引,顺序并无所谓。如果使用组合索引,顺序就非常重要了。

你可以在多个字段创建索引,查询可以用字段子集做为开头来匹配索引。

如果你在a,b,c上创建索引。

下列查询都可以使用这个索引。
a
a,b
a,b,c
1.6+新特性
目前,可以组合索引中的字段条件可以为等值的组合或者范围查询。
如果索引中的首个字段存在于查询中,那么查询优化器可能会选用这个索引。
如果索引中的首个字段不存在于查询中,如果显式使用hint才可以使用这个索引。
索引的子集字段在查询中,这种索引可以用在很多地方。
做为一般的规则来说,对于指定的查询,最又索引就是那些要查询的字段。

Sparse Indexes稀疏索引

目前的限制
稀疏索引只能在一个字段上创建. SERVER-2193

1.7.4的新功能。

sparse index就是在一个存在于document的字段上创建的索引。 
任何document中不存在这个索引的字段,那么就不会保存在索引中。之所以叫sparse,当没有索引字段的值的时候,document也就丢失了。

Sparse indexes, 不是完整的索引,也和完整索引操作上有所不同。当使用一个sparse index排序,一些document就不会返回了。

只有存在于index中的document才会返回。

db.people.ensureIndex({title : 1}, {sparse : true})
db.people.save({name:"Jim"})
db.people.save({name:"Sarah", title:"Princess"})
db.people.find({title:{$ne:null}}).sort({title:1})
// 只返回 Sarah的文档

你可以把sparse何unique索引结合起来,来给那些没有丢失字段的document加以唯一性约束。

Unique Indexes唯一索引

MongoDB支持唯一索引,保证了插入document的索引值和已存在document索引值不重复。

下面的示例就保证了不会有两个document中的firstname和lastname值相等。

db.things.ensureIndex({firstname: 1, lastname: 1}, {unique: true});

丢失的键

当保存一个不存在唯一索引的字段的document,那么这个字段的值默认为null。但是这种缺失索引字段的document只能插入一次了。

db.things.ensureIndex({firstname: 1}, {unique: true});
db.things.save({lastname: "Smith"});
 /这个操作就会发生错误。
db.things.save({lastname: "Jones"});
重复的值

一个唯一索引的值是不能重复的。

保存首个document,而要删除其他索引值和它重复的document,添加参数dropDups

db.things.ensureIndex({firstname : 1}, {unique : true, dropDups : true})

在后台创建索引

创建一个索引,默认的情况会阻塞其他数据库的操作。在1.3.2+版本,支持后台创建索引 background index build option .

删除索引

删除指定collection的索引语句为

db.collection.dropIndexes();

删除一个单独的索引

db.collection.dropIndex({x: 1, y: -1})

直接运行一个命令

// 注意:1.3.2之前 命令是"deleteIndexes", 而不是 "dropIndexes"
// 从foo collection中删除 {y:1}索引
db.runCommand({dropIndexes:'foo', index : {y:1}})
// 删除所有索引
db.runCommand({dropIndexes:'foo', index : '*'})

重新索引

reIndex会重新创建索引

db.myCollection.reIndex()
// 等同于:
db.runCommand( { reIndex : 'myCollection' } )

一般来说用不上。如果collection大小增长太快或者索引占用空间看起来很大,就可以使用reIndex。

修复数据库会重新创建索引。

额外要注意的

  • MongoDB 索引区分大小写。

  • 当你更新u update 一个对象, 如果对象占用了之前分配的区域, 仅仅是那些更新值的索引需要更新,这样做提升了性能。注意如果对象增大并且需要迁移,那么所有的索引也需要更新,过程比较慢。

  • 索引信息在system.indexes的collection中。Index 运行 db.system.indexes.find() 查看索引。

索引的性能

索引主要用于查询,也包括了排序,非常的快。通过索引查找的document更新也是非常快的。

然而,要记住的是,索引会降低插入和删除的性能。原因就是数据的写入也要同时也如索引。

但是索引对于那些读取多于写入的collection尤为有用。

对于写入数据频率高的collection,索引会影响性能。

大部分collection都是读取率高,所以索引对于大部分场景还是非常不错的。

不适用索引来进行排序
如果排序的数据非常少(小于4M),那就不需要索引。一般要limit和sort一起使用。

Geospatial地理空间

  • 查看Geospatial Indexing.

转载于:https://my.oschina.net/MrMichael/blog/282163

MongoDB 索引相关推荐

  1. 关于Mongodb索引创建的一些体会

    2019独角兽企业重金招聘Python工程师标准>>> mongodb索引分类以及创建我就不多说了,如果想了解可以直接在百度上搜索,这里我说一下关于索引创建的个人想法. 1.优先给一 ...

  2. MongoDB · 引擎特性 · MongoDB索引原理

    MongoDB · 引擎特性 · MongoDB索引原理 数据库内核月报 原文链接 http://mysql.taobao.org/monthly/2018/09/06/ 为什么需要索引? 当你抱怨M ...

  3. MongoDB索引实战技巧

    为什么80%的码农都做不了架构师?>>>    本文内容源自Kyle Banker 的 MongoDB In Action一书.主要描述了MongoDB索引相关的一些基础知识和使用技 ...

  4. mongodb 索引建立问题

    mongodb  索引建立问题 1.主从库索引建立不是同步建立: MONGODB 2.6.6 版本,索引建立并不是同步的,而是主库建立完成后,从库接着建立索引.     不知是3.0版本是否也一样,以 ...

  5. MongoDB 索引-9

    MongoDB 索引 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录. 这种扫描全集合的查询效率是非常低的,特别在处理大 ...

  6. mongodb 索引建立问题

    mongodb  索引建立问题 1.主从库索引建立不是同步建立: MONGODB 2.6.6 版本,索引建立并不是同步的,而是主库建立完成后,从库接着建立索引.     不知是3.0版本是否也一样,以 ...

  7. MongoDB索引原理和具体使用

    1. MongoDB 索引是用来干嘛? 索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录. 这种扫描全集合的查询效率是非常 ...

  8. MongoDB索引策略和索引类型

    1. MongoDB索引策略和索引类型–简介 MongoDB是一个开放源代码,面向文档的跨平台数据库,它使用C ++开发,并且是最流行和使用最广泛的NoSQL类型数据库之一. 它可在具有键-值对的类J ...

  9. MongoDB索引,性能分析

    索引的限制: 索引名称不能超过128个字符 每个集合不能超过64个索引 复合索引不能超过31列 MongoDB 索引语法 db.collection.createIndex({ <field&g ...

最新文章

  1. 太形象!打工人入职前后的心理变化 | 每日趣闻
  2. 检查IP是否可用的方法
  3. 写给初学前端工程师的一封信 (转于Kejun)
  4. C语言面试基础知识整理
  5. Juniper ex4200 端口镜像问题
  6. 网络工程师需要具备哪些素质或专业技术
  7. 081212 晴
  8. spgridview的过滤功能回调时发生错误~
  9. linux runqueue定义,linux – 了解rt_rq(实时runqueue)内核中数据成员的使用
  10. hash函数MurmurHash
  11. Duplicate entry 'xxx' for key 'xxx'
  12. python中引用javascript代码块
  13. 【EasyUI】如何根据条件控制可编辑表格某字段是否可以编辑;
  14. linux系统双显示器怎么设置复制,linux系统双显示器设置
  15. 帝国cms灵动标签调用标题图片没有图片时让其显示默认图片的方法
  16. cad2017单段线_cad2017新功能介绍
  17. 前端将时间格式‘2020-03-03T16:49:18.000+0000‘转化成正常格式‘2020-03-03 16:49:18‘ _@jie
  18. Java异步--CompletableFuture--实例
  19. 【C++】深度剖析string类的底层结构及其模拟实现
  20. 王卫,零售风口练习生

热门文章

  1. train loss与test loss结果分析
  2. java程序员封闭_变态级JAVA程序员面试32问(转)
  3. oracle创建directirtory,oracle11g使用Direct NFS创建表空间
  4. mysql表自关联_数据库之自关联
  5. nginx-ingress 配置https,同支持http
  6. Intellij idea高效使用教程
  7. class viewController has no initializers解决办法
  8. app显示服务器图片不显示,如何读取并显示服务器上不在webapp目录上的图片?
  9. Docker学习(7)——常用的镜像构建方式简介
  10. linux 中的who的参数,linux who命令参数及用法详解