索引通常能够极大的提高查询的效率。如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
MongoDB使用 createIndex() 方法来创建索引。语法如下:
db.collection.createIndex(keys, options)
参数说明:
keys:为你要创建索引的字段。如果值为1,表示按升序创建索引;如果为-1,表示按降序创建索引;
options:为创建索引的可选选项。如下:
background:MongoDB创建索引过程会阻塞其它数据库操作,可通过background指定以后台方式创建索引,后台创建将不阻塞数据库其他操作。默认值为false。
unique:创建唯一索引,默认值为false。
name:指定索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
sparse:对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false。
expireAfterSeconds:指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
v:索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。
weights:索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。
default_language:对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语
language_override:对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language。
实例:在 users 集合中创建一个索引。
> db.users.createIndex({name:1, age:-1}, {background:true}); "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
上面在users集合的name字段和age字段上面创建索引,且该索引是后台创建。
使用该方法来获取指定集合中的索引列表。实例如下:
> db.users.getIndexes(); { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.users" }, { "v" : 2, "key" : { "name" : 1, "age" : -1 }, "name" : "name_1_age_-1", "ns" : "test.users", "background" : true } ]
查看集合中索引大小。如下:
> db.users.totalIndexSize(); 32768
MongoDB中可以利用 dropIndexes() 方法删除指定集合中的索引。如下:
# 查看集合中的索引 > db.users.getIndexes(); { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.users" }, { "v" : 2, "key" : { "name" : 1, "age" : -1 }, "name" : "name_1_age_-1", "ns" : "test.users", "background" : true } ] # 删除名称为 name_1_age_-1 的索引 > db.users.dropIndex("name_1_age_-1"); { "nIndexesWas" : 2, "ok" : 1 } # 查看当前集合中的索引列表 > db.users.getIndexes(); { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "test.users" } ] # 删除集合中全部的索引 > db.users.dropIndexes()