索引
概念不多做介绍,需要提的是mongodb是b树。
索引的类型
mongodb的索引有很多种
单字段索引
:常见的索引
复合索引
:多字段的索引
地理空间索引(Geospatial Index)
:为支持地理空间坐标数据的有效查询,mongodb提供两种特殊索引:
- 返回结果使用平面几何的二维索引
- 返回结果使用球面几何的二维球面索引
文本索引(Text Index)
:支持在集合中搜索字符串内容。这些文本索引不存储特定语言的停止词(例如“the”、“a”、“or”),而将集合中的词作为词干,只存储根词。
mongodb的文本索引性能并不高,用的话还是es之类成熟的搜索引擎比较好
哈希索引(Hashed Index)
:为支持基于散列的分片提供的索引类型。他对字段值的散列进行索引。这些索引范围在其范围内的值分布更加随机。只支持相等匹配,不支持基于范围的查询。
查看索引
db.collection.getIndexes()
结果示例:
v
:索引引擎的版本号
key
:有索引的字段。1代表是升序的方式,-1是降序
name
:索引的名称
ns
:namespace,数据库.集合
创建索引
//3.0版本之前,之后还可以用这个,不过效果一样
db.collection.ensureIndex(keys , options)
//3.0版本之后
db.collection.createIndex(keys , options)
Parameter | Type | Description |
---|---|---|
keys | document | 包含字段和值得文档,字段是索引键,值是索引类型。 |
options | document | 可选,包含一组控制索引创建的选项的文档 |
options的列表:
Parameter | Type | Description |
---|---|---|
background | Boolean | 建索引过程会阻塞其他数据库操作,这个可制定以后台的方式创建。默认为false |
unique | Boolean | 索引是否是唯一索引。默认为false |
name | String | 索引名称。如果未指定,就是字段名和排序生成一个 |
dropDups | Boolean | 3.0+版本已废弃。建立唯一索引时是否删除重复记录。默认为false |
sparse | Boolean | 对文档中不存在的字段数据不启用索引。如果为true,在索引字段中不会查出不包含对应字段的文档。默认为false |
expireAfterSeconds | Integer | 制定一个以秒为单位的数值,完成TTL设定,设定集合的生存时间 |
v | index version | 索引版本号。默认取决于mongodb创建索引时运行的版本 |
weights | document | 权重,数值在1到99,999之间,表示该索引的权重 |
default_language | String | 对于文本索引,改参数决定停用词、词干和词器的规则的列表。默认是英文 |
language_override | String | 对于文本索引,改参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值是language |
单字段索引创建
db.comment.createIndex({userid:1})
复合索引创建
db.comment.createIndex({userid:1,nickname:-1})
移除索引
//移除指定索引
db.collection.dropIndex(index)
//移除所有索引
db.collection.dropIndexes()
Parameter | Type | Description |
---|---|---|
index | String or document | 指定要删除的索引。可以通过索引名称或索引规范文档指定索引。如果要删除文本索引,要指定索引名称 |
示例:
db.comment.dropIndex("userid_1")
//移除comment集合中userid字段上的升序索引
db.comment.dropIndex({userid:1})
索引的使用
执行计划
如果想知道建立的索引是否有效,效果如何,都需要查看执行计划。类似mysql的explain
语法:
db.collection.find(query , options).explain(options)
例如:
db.comment.find({userid:"1001"}).explain()
涵盖的查询
如果查询的字段只有索引字段时,mongodb会直接从索引里面拿结果,而不会扫描任何文档或将文档带入内存。这种方式效率很高