说到数据库就不得不说索引,索引就像一本书的目录,可以给我们快速定位所要的结果并返回,大大节省了查询时间,MongoDB索引采用的是B-tree数据结果,查询效率极高
官方文档。下面就来讲一下MongoDb的索引
索引类型
1.默认索引
MongoDB在创建集合的时候会默认给集合的_id
字段创建唯一索引
,而且这个字段的索引是无法删除的,但是你可以自定义它的值
2.创建索引
db.collection.createIndex( <key and index type specification>, <options> )
<key and index type specification>
定义索引字段和排序规则 1升序 -1降序
可选参数<options>
列表
参数名称 | 类型 | 描述说明 |
---|---|---|
background | bool | 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 “background” 可选参数。 “background” 默认值为false。 |
unique | bool | 建立的索引是否唯一。指定为true创建唯一索引。默认值为false. |
name | string | 索引的名称。如果未指定,MongoDB的通过_ 连接索引的字段名和排序顺序生成一个索引名称。 |
sparse | bool | 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false |
expireAfterSeconds | Int | 指定一个以秒 为单位的数值,完成 TTL 设定,设定集合 的生存时间。 |
v | index version | 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。 |
weights | Documents | 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。 |
db.users.createIndex({"age": -1}, {name: "users_age"})
给users集合的age字段创建索引,索引名称为users_age
3.复合索引
MongoDB和mysql一样也支持多个字段建立复合索引 如:
db.users.createIndex({"age":1, "scores": -1})
索引会先按age升序排序,然后再相同的age中按scores降序排序
除了以上3中索引,MongoDB还有 多键索引(Multikey Indexes)、文本索引(Text Indexes)、哈希索引(Hashed Indexes)等
索引属性
1.唯一索引
db.collection.createIndex( <key and index type specification>, { unique: true } )
2.局部索引
局部索引仅索引集合中符合指定条件的文档。局部索引具有较低的存储要求,并降低了索引创建和维护的性能成本
3.稀疏索引
索引的稀疏属性可确保索引仅包含
具有索引字段的文档的条目。索引会跳过没有索引字段的文档。 您可以将稀疏索引选项与唯一索引选项组合,以拒绝具有字段重复值的文档,但忽略没有索引键的文档
还有MongoDB还有一些别的属性,如TTL,这里不一一说明了
索引管理
1.查看集合的全部索引
db.collection.getIndexes()
2.查看集合索引的大小
db.collection.totalIndexSize()
3.查看整个库的索引
db.getCollectionNames().forEach(function(collection) {
indexes = db[collection].getIndexes();
print("Indexes for " + collection + ":");
printjson(indexes);
});
4.删除单个索引
db.collection.dropIndex(index)
db.collection.dropIndex( “scores” ) //删除scores字段的索引
db.collection.dropIndex({“age”:-1}) //删除age字段的降序索引
5.删除全部索引
db.collection.dropIndexes()
6.修改索引
官方原话,除了过期索引TTL,其余索引的修改方式只能先删除再创建
To modify an existing index, you need to drop and recreate the index. The exception to this rule is TTL indexes, which can be modified via the
collMod
command in conjunction with theindex
collection flag.