MongoDB索引

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

举个简单的例子,假如您有一个集合,其中包含了数千甚至上万个没有索引的文档,当我们在集合中查找某个文档时,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"
        }
]