MongoDB索引

1年前 (2024-04-27)
索引是特殊的数据结构,存储在一个方便遍历和读取的数据中。索引在任何数据库中都非常重要,通过使用索引,可以大大提高查询语句的执行效率。

举个简单的例子,假如您有一个,其中包含了数千甚上万个没有索引的文档,当我们在中查找某个文档时,MongoDB 需要扫描整个来寻找所需的文档,这种扫描效率极低,特别是在处理大量的数据时,可能需要花费几十秒甚几分钟,这对网站的性能是非常致的。但如果有索引就不一样了,MongoDB 可以使用这些索引来限制需要扫描的文档数。下面我们就来看一下 MongoDB 中索引的使用。

createIndex() 方法

MongoDB 中您可以使用 createIndex() 方法来创建索引,其语法格式如下:

db.collection_name.createIndex(keys, options)

参数说明如下:
  • keys:由键/值对组成,其中键用来定义要创建索引的字段,值用来定义创建索引的顺序,1 表示按升序创建索引,-1 表示按降序来创建索引;

  • options:可选参数,其中包含一组控制索引创建的选项,可选值如下表所示。


参数

类型

描述

background

Boolean

可选参数,当值为 true 时,表示在后台构建索引,避免在创建索引的过程阻塞其它数据库操作,默认值为 false

unique

Boolean

创建索引,当值为 true 时表示创建索引,以避免重复数据的插入,默认为 false

name

string

索引的名称。如果未指定,MongoDB 将通过连接索引的字段名和排序顺序生成一个索引名称

dropDups

Boolean

在建立索引时是否删除重复记录,设置为 true 则表示创建索引,默认值为 false,3.0 版本之后废弃

sparse

Boolean

对文档中不存在的字段数据不启用索引,这个参数需要特别注意,如果设置为 true 的话,则在索引字段中不会查询出不包含对应字段的文档。默认值为 false

expireAfterSeconds

integer

指定一个以秒为单位的数值,完成 TTL 设定,设定的生存时间

v

index version

索引的版本号,默认的索引版本取决于 mongod 创建索引时运行的版本

weights

document

索引权重值,数值在 1 到 99999 之间,表示该索引相对于其他索引字段的得分权重

default_language

string

对于文本索引,该语言用于确定停用词列表以及词干分析器和令牌生成器的规则,默认为英语

language_override

string

对于文本索引,指定文档中包含要替代默认语言的语言的字段名称,默认值为 language


【示例】为“course”中的 title 字段创建索引:

> db.course.createIndex({"title":1})

{

"createdCollectionAutomatically" : false,

"numIndexesBefore" : 1,

"numIndexesAfter" : 2,

"ok" : 1

}

另外,createIndex() 方法还可以同时为多个字段创建索引,如下所示:

> db.course.createIndex({"title":1, "author":-1})

{

"createdCollectionAutomatically" : false,

"numIndexesBefore" : 2,

"numIndexesAfter" : 3,

"ok" : 1

}

dropIndex() 方法

除了可以创建索引外,您还可以使用 dropIndex() 方法来删除指定的索引,其语法格式如下:

db.collection_name.dropIndex(index)

其中 index 用来指定要删除的索引,可以是索引名称key的形式,也可以是{key:1}的形式。

【示例】删除“course”中“title”字段的索引:

> db.course.dropIndex({"title":1})

{ "nIndexesWas" : 3, "ok" : 1 }

dropIndexes() 方法

dropIndexes() 方法同样用来删除索引,与 dropIndex() 方法不同 dropIndexes() 方法可以同时删除中的多个索引,其语法格式如下:

db.collection_name.dropIndexes()

注意:在使用 dropIndexes() 方法不需要提供任何参数。

【示例】同时删除“course”中 title 与 author 字段的索引:

> db.course.dropIndexes()

{

"nIndexesWas" : 2,

"msg" : "non-_id indexes dropped for collection",

"ok" : 1

}

getIndexes() 方法

getIndexes() 方法可以获取中所有索引,语法格式如下:

db.collection_name.getIndexes()

使用 getIndexes() 方法同样不需要提供任何参数,如下例所示:

> db.course.getIndexes()

[

{

"v" : 2,

"key" : {

"_id" : 1

},

"name" : "_id_",

"ns" : "bianchengbang.course"

},

{

"v" : 2,

"key" : {

"title" : 1,

"author" : -1

},

"name" : "title_1_author_-1",

"ns" : "bianchengbang.course"

}

]