MongoDB索引

1. db.col.getIndexes()查看当前集合的索引情况

2. db.col.ensureIndex({x:1})创建索引

3.0版本后推荐使用createIndex()来创建索引

如果文档数目较多,创建索引需要消耗一定的时间。如果系统负载较重,且有很多已经存在的文档,不能直接使用这个命令进行直接创建。需要在使用数据库之前就将索引创建完毕。否则严重影响数据库的性能。在线上服务时,对常用的查询一定要添加相应的索引。由于索引需要在插入数据之后再次构建,所以添加索引会对写入造成一定的性能影响。但是为了查询的高效,这点影响是值得的。

3. 索引的种类

  • _id索引
  • 单键索引
  • 多键索引
  • 复合索引
  • 过期索引
  • 全文索引
  • 地理位置索引
_id索引
  • _id索引是绝大多数集合默认建立的索引。
  • 对于每个插入的数据,MongoDB都会自动生成一条唯一的_id字段。
单键索引
  • 单键索引是最普通的索引
  • _id索引不同,单键索引不会自动创建。
多键索引
  • 多键索引与单键索引创建形式相同,区别在于字段的值。
  • 单键索引:值为一个单一的值,例如字符串,数字或者日期。
  • 多键索引:值具有多个记录,例如数组。
复合索引
  • 当我们的查询条件不只有一个时,就需要建立复合索引。
过期索引
  • 过期索引:是在一段时间后会过期的索引。
  • 在索引过期后,相应的数据会被删除。
  • 这适合存储一些在一段时间之后会失效的数据比如用户的登录信息、存储的日志。
db.collection.ensureIndex({time:1},{expireAfterSeconds:10})
  • 存储在过期索引字段的值必须是指定的时间类型。
  • 说明:必须是ISODate或者ISODate数组,不能使用时间戳,否则不能被自动删除。
  • 如果指定了ISODate数组,则按照最小的时间进行删除。
  • 过期索引不能是复合索引。
  • 删除时间不是精确的。
  • 说明:删除过程是由后台程序每60s跑一次,而且删除也需要一些时间,所以存在误差。
全文索引

全文索引:对字符串与字符串数组创建全文可搜索的索引。
适用情况:{author:"",title:"",article:""}

  • 建立方法(一个数据集合中只允许创建一个全文索引):
    db.articles,ensureIndex({key:"text"})
    db.articles,ensureIndex({key_1:"text",key_2:"text"})
    db.articles,ensureIndex({"$**":"text"})
db.articles.ensureIndex({"article":"text"})
  • 如何使用全文索引查询
db.articles.find({$text:{$search:"coffee"}})
db.articles.find({$text:{$search:"aa bb cc"}})     // 或
db.articles.find({$text:{$search:"aa bb -cc"}})    //不包含cc 
db.articles.find({$text:{$search:"\"aa\"\"bb\"\"cc\""}})  // 与
  • 全文索引相似度
    $meta操作符:{score:{$meta:"textScore"}}
    写在查询条件后面可以返回结果的相似度。
    与sort一起使用,可以达到很好的实用效果。
db.articles.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}})
  • 全文索引非常强大,但是同样存在限制
  • 每次查询,只能指定一个$text查询
  • $text查询不能出现在$nor查询中
  • 查询中如果包含了$texthint不再起作用
  • 很可惜,MongoDB全文索引还不支持中文
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值