设为首页 收藏本站
查看: 1579|回复: 0

[经验分享] MongoDB 索引篇

[复制链接]

尚未签到

发表于 2017-12-15 13:33:09 | 显示全部楼层 |阅读模式
MongoDB 索引篇

索引的简介
  

索引可以加快查询的速度,但是过多的索引或者规范不好的索引也会影响到查询的速度。且添加索引之后的对文档的删除,修改会比以前速度慢。因为在进行修改的时候会对索引进行更新。  

  创建一个简单的索引
  

db.wsc.ensureIndex({"username":1})  

  这样在查找的时候速度回变快
  

db.wsc.find({usernmae:"jack ma"})  

  mongodb限制每个集合最多有64个索引。通常,在一个特定的集合上,不应该拥有两个以上的索引。
  
.

  
复合索引
  
建立了一个复合索引(建立在多个字段上的索引),如果查询条件包括多个键,这个索引就非常有用
  

db.users.ensureIndex({'age':1, 'username': 1})  


查询方式
  点查询 point query
  
用于查询单个值(尽管包含这个值的文档可能有多个)
  

db.users.find({'age': 21})  

  可能21岁的人很多,所以这个查询会有很多的结果的返回。
  

  
多值查询 multi-value-query
  
查找多个值相匹配的文档。多值查询也可以理解为多个点查询。
  

db.users.find({'age': {"$gte": 21, "$lte": 30}})  


索引的类型
  单键索引
  
就是最普通的的索引
  

db.users.ensureIndex({'username': 1})  

  
唯一索引
  
确定集合的每一个文档的指定键都是唯一的值
  

db.users.ensureIndex({'username': 1, unique: true})  

  这样创建了一个值,以后再插入数据的时候,username键的值不能重复,否则会插入不成功
  

  
多键索引
  
如果某个键在文档中被标记为数组,那么这个索引就会被标记为多键索引
  

> db.members.find()  
{ "_id" : ObjectId("1"), "tags" : [  "ame",  "fear",  "big" ] }
  
{ "_id" : ObjectId("2"), "tags" : [  "ame",  "fear",  "big",  "chi" ] }
  
{ "_id" : ObjectId("3"), "tags" : [  "ame",  "jr",  "big",  "chi" ] }
  

  当我查找tags='jr'数据时,db会查找所有文档,所以nscanned=3,并且返回一条,此时n=1。
  

>db.members.find({tags: 'jr'}).explain()  
{
  "cursor" : "BasicCursor",
  "isMultiKey" : false,
  "n" : 1,
  "nscanned" : 3,
  
}
  

  然后建立索引
  

db.members.ensureIndex({tags:1})  

  之后我们在对tags='jr'进行查找,此时nscanned=1,并且isMultiKey由原来的false变为true。所以可以说明,mongodb对数组做了多个键的索引,即把所有的数组元素都做了索引。
  

> db.members.find({tags: 'jr'}).explain()  
{
  "cursor" : "BtreeCursor tags_1",
  "isMultiKey" : true,
  "n" : 1,
  "nscannedObjects" : 1,
  "nscanned" : 1,
  
}
  

  
过期索引
  
顾名思义就是索引过期之后,相应的数据会被删除。比较适合一些存储一段时间的数据。
  
和设置单键索引很类似,只是多个expireAfterSeconds参数,单位是秒。
  

db.collectionName.ensureIndex({key: 1}, {expireAfterSeconds: 10})  

  例子 下面建立一个索引,然后数据会在30秒后删除
  

db.members.ensureIndex({time:1}, {expireAfterSeconds: 30})  

  被索引键的值必须是ISODate时间类型,例如new Date()类型。如果是非时间类型,则不会自动删除
  


  稀疏索引
  
使用sparse可以创建稀疏索引和唯一索引
  

db.users.ensureIndex({'email': 1}, {'unique': true, 'sparse': true})  

  创建了稀疏索引的字段,在插入数据的时候无论是否这个字段是否存在都可以插入成功。
  哈希索引
  

db.collection.createIndex( { _id: "hashed" } )  

  地理位置索引
  当文档中有这样的数据时
  

    db.places.insert(  {
  loc : { type: "Point", coordinates: [ -73.97, 40.77 ] },
  name: "Central Park",
  category : "Parks"
  }
  )
  
db.places.insert(
  {
  loc : { type: "Point", coordinates: [ -73.88, 40.78 ] },
  name: "La Guardia Airport",
  category : "Airport"
  }
  
)
  

  可以创建地理索引
  

db.places.createIndex( { loc : "2dsphere" } )  

  文本索引

索引管理
  system.indexes集合中包含了每个索引的详细信息
  

db.system.indexes.find()  

  
1 创建索引
  
mongo shell中国有两个方法
  

    ensureIndex()  createIndex()
  

  例子
  

db.users.ensureIndex({'username': 1})  

  2 getIndexes()查看索引
  

db.collectionName.getIndexes()  

  ——————————————————
  

db.users.getIndexes()  
[
  {
  "v" : 1,
  "key" : {
  "_id" : 1
  },
  "ns" : "test.users",
  "name" : "_id_"
  },
  {
  "v" : 1,
  "key" : {
  "username" : 1
  },
  "ns" : "test.users",
  "name" : "username_1"
  }
  
]
  

  3.dropIndex删除索引
  

> db.users.dropIndex("username_1"){ "nIndexesWas" : 2, "ok" : 1 }  

  或
  

db.users.dropIndex({"username":1})  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-424353-1-1.html 上篇帖子: mongodb选型问题 下篇帖子: Windows下MongoDB常用命令
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表