上一篇:MongoDB(5)—文档的增删改查
参考资料:MongoDB手册
一、索引基本概念
索引支持在MongoDB中高效执行查询。没有索引,MongoDB必须执行集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的那些文档。如果查询存在适当的索引,则MongoDB可以使用该索引来限制它必须检查的文档数。
索引是特殊的数据结构,它以易于遍历的形式存储集合数据集的一小部分。索引存储一个特定字段或一组字段的值,按该字段的值排序。索引条目的排序支持有效的相等匹配和基于范围的查询操作。另外,MongoDB可以通过使用索引中的顺序来返回排序的结果。
我们在创建文档的时候会发现,MongoDB默认情况下都会为我们生成一个_id
字段,此字段其实就是一个索引。默认情况下,MongoDB都会在此字段上创建唯一索引以防止客户端插入两条内容相同的数据。
MongoDB的索引使用的B-Tree的数据结构,MySql使用的是B+Tree类型的数据结构
二、索引创建
语法:db.集合名称.createIndex(keys,options)
options的可选项:
Parameter | Typ | Description |
background | Boolean | 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false。 |
unique | Boolean | 建立的索引是否唯一。指定为true创建唯一索引。默认值为false. |
name | string | 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。 |
sparse | Boolean | 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false. |
expireAfterSeconds | integer | 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。 |
weights | document | 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。 |
default_language | string | 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语 |
三、索引分类
1.单字段索引
顾名思义:就是为文档中的某一个字段建立索引。
创建索引的语法: db.集合名称.createIndex({field:1}) //在field字段上建一个升序索引,1改为-1则为降序索引
2.复合索引
为文档中的多个字段建立索引。
创建索引的语法: db.集合名称.ensureIndex({field01:1,field02:-1,……})
//以上语法为field01和field02两个字段都建立了索引
3.唯一索引
此类索引确保文档中的指定字段拥有唯一的value值。
创建语法:db.集合名称.ensureIndex({field:1},{unique:true})
4.过期索引
就是 一种会过期的索引,索引过期之后,会删除索引对应的数据
创建语法:db.集合名称.ensureIndex({time:1},{expireAfterSecond:30})
expireAfterSecond
表示过期时间,单位是秒
,time表示索引的字段,time的数据类型必须是ISODate类型,否则索引过期不会删除time的数据不会被删除。
5.地理空间索引
5.1 2d索引
2d索引是MongoDB最常用的地理空间索引之一,用于游戏地图。2d索引用于扁平表面,而不是球体表面。如果用在球体表面上,在极点附近会出现大量的扭曲变形。
5.2 2dsphere索引
2dsphere索引是MongoDB最常用的地理空间索引之一,用于地球表面类型的地图。允许使用GeoJSON格式(http://www.geojson.org)指定点、线、多边形。
四、查看索引
返回集合中所有索引的数据:
查看语法: db.集合名称.getIndexes()
v(version):
表示索引的引擎版本
key:
表示建立索引的键
name:
索引名(默认为 key值+排序方式)
ns(name space):
表示索引所在的位置:数据库.集合
五、删除索引
1.删除指定索引
语法: db.集合名称.dropIndex(index_name)
删除指定的索引,可以通过指定索引名来进行删除。
2.删除某集合中所有索引
注意:使用此语法时,_id
索引不会被删除。
语法: db.集合名称.dropIndexes()
六、查询索引执行情况
如果我们想要了解一下自己创建的索引到底有没有生效,则可以使用下面语法来查询索引执行情况:
db.集合名称.find(query,options).explain(options)
栗子:想查看students
集合中,根据code
查询数据是否能够用上索引(前提是现在students
集合中已经存在code
字段建立的索引)
然后我们就可以使用explain
的语法来查询索引执行计划:
这里显示为FETCH(抓取)
,则表示使用了索引。如果显示的为COLLSCAN(集合扫描)
,则表示没有用到索引。
注意:
如果你查询的字段正好是你建立索引的字段,那么MongoDB会直接从索引中返回数据,而不会再通过索引去集合中获取数据并返回,所以此时的查询效率会非常高。