索引的作用:与关系型数据库一样,Mongodb中的索引也是用来加快查询速度的。
索引的本质:索引的本质其实就是存储了某个字段或某几个字段的值,并根据字段值进行了排序,然后便于我们快速查询.
索引的种类
1.默认的_ID
mongodb的每个集合都有一个_id字段,在这个字段上默认就存在索引了。
2.单键索引
在一个字段上创建索引,如下:
db.collectionName.createIndex({name:1});//姓名字段上创建索引
3.复合索引
在多个字段上创建联合索引,如下:
db.collectionName.createIndex({name:1,age:-1,address:1})
复合索引比单键索引丰富很多,例如这里 {name:1,age:-1,address:1}还包含有{name:1},{name:1,age:-1}这俩个隐式索引的. 也就是说我们查找类似于 find({name:‘张三’})或者find({name:‘李四’,age:20})的时候也可以用到这个复合索引. 但是find({age:‘李四’})之类的就命中不了这个复合索引
4.文本索引
monodb支持在字符串的内容上进行文本检索的查询操作。
一个集合最多只能有一个文本索引
创建:
db.colletionName.createIndex({fileName1:"text",fileName2:"text"});
使用:
使用$text操作符,在一个有文本索引的集合上执行文本检索
db.collectionName.find({$text:{$search:"java shop"}})//查询所有包含java或者shop的文档
5.地理位置索引
6.哈希索引
索引的属性
1.唯一索引
db.collectionName.createIndex({a:1,b:1,c:1},{unique:true})
唯一索引能保证索引的字段不会出现相同的值(相当于具有’索引’+'唯一约束’功能)
2.TTL索引
TTL索引的作用是对某个日期字段配置过期属性,然后就能实现对文档自动过期删除。
注意:必须是日期字段
db.collectionName.createIndex({"lastModifiedDate":1},{expireAfterSeconds:3600}) //单位是秒
MongoDB会开启一个后台线程读取该TTL索引的值来判断文档是否过期,但不会保证已过期的数据会立马被删除,因后台线程每60秒触发一次删除任务,且如果删除的数据量较大,会存在上一次的删除未完成,而下一次的任务已经开启的情况,导致过期的数据也会出现超过了数据保留时间60秒以上的现象。
对于副本集而言,TTL索引的后台进程只会在primary节点开启,在从节点会始终处于空闲状态,从节点的数据删除是由主库删除后产生的oplog来做同步。
TTL索引除了有expireAfterSeconds属性外,和普通索引一样
3.部分索引
只针对符合某个特定条件的文档建立索引
4.稀疏索引
只针对存在索引字段的文档建立索引.
非稀疏的索引会索引每篇文档,如果某个文档中索引字段不存在则会存个null值。
弊端
索引虽然能提高查询效率,但会降低写入性能.
因为每次数据库的写操作都会导致索引的位置的移动。