MongoDB索引管理(二)
引言
在数据量超大的情形下,任何数据库系统在创建索引时都是一个耗时的大工程。MongoDB也不例外。MongoDB索引的创建有两个选择:一个是前台方式,一个是后台方式。
创建索引
索引创建方式
前台方式(缺省)
1 | 缺省情况下,当为一个集合创建索引时,这个操作将阻塞其他的所有操作。 |
后台方式
1 | 将索引创建置于到后台,适用于那些需要长时间创建索引的情形 |
语法结构
MongoDB创建索引使用ensureIndex()
方法。
1 | db.COLLECTION_NAME.ensureIndex(keys[,options]) |
Keys : 要创建的索引字段
- 1 按升序创建索引
- -1 按降序来创建索引
可选参数
参数名 | 类型 | 描述 |
---|---|---|
background | Boolean | 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 “background” 可选参数。 “background” 默认值为false |
unique | Boolean | 建立的索引是否唯一。指定为true创建唯一索引。默认值为 false |
name | string | 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称 |
dropDups | Boolean | 3.0+版本已废弃。在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为false |
sparse | Boolean | 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档。默认值为 false |
expireAfterSeconds | integer | 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。 |
v | index version | 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。 |
weights | document | 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重 |
default_language | string | 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语 |
language_override | string | 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的 language,默认值为 language |
后台创建范例
1 | db.COLLECTION_NAME.ensureIndex({name: 1, age: 1}, {background: true}); |
通过在创建索引时加 background:true 选项,让创建工作在后台执行。
使用索引和不使用差距很大,合理使用索引,一个集合适合做 4-5 个索引。
查看索引创建进度
可使用 db.currentOp()
命令观察索引创建的完成进度。
1 | > db.currentOp({ |
终止索引的创建
1 | db.killOp(); |
查看索引
MongoDB提供了查看索引信息的方法:
getIndexes()
:查看集合的所有索引;totalIndexSize()
:查看集合索引的总大小;db.system.indexes.find()
:查看数据库中所有索引信息。
查看集合中的索引getIndexes()
1 | db.COLLECTION_NAME.getIndexes(); |
查看集合中的索引大小totalIndexSize()
1 | db.COLLECTION_NAME.totalIndexSize(); |
查看数据库中所有索引db.system.indexes.find()
1 | db.system.indexes.find(); |
删除索引
不再需要的索引,可以将其删除。删除索引时,可以删除集合中的某一索引,也可以删除全部索引。
删除指定的索引dropIndex()
1 | db.COLLECTION_NAME.dropIndex("INDEX-NAME"); |
删除所有索引dropIndexes()
1 | db.COLLECTION_NAME.dropIndexes(); |
重建索引
数据表经多次修改后导致文件产生空洞,索引文件也是如此。因此可通过重建索引来提高索引的查询效率,类似MySQL的optimize表。根据MongoDB文档,通常不需要定期重建索引,且始终在前台构建索引。
官网文档可查看:https://docs.mongodb.com/manual/reference/command/reIndex/
1 | // 该方法的调用不接受任何的参数 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 彩虹马的博客!
评论