




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
mongodb索引讲解与性能调优目录一、为什么用索引:1二、索引管理:1a)查询索引:1i.查询已有索引的明细:1ii.查询索引大小:2b)创建索引:2c)删除索引:2d)修改索引:2三、索引种类:3a)默认索引:3b)单列索引:3c)组合索引:3d)子文档索引:3e)唯一索引:3f)Sparse索引:3g)Covered 索引:3四、正则表达式在索引中的使用:4五、索引分析:4a)索引命中:4b)使用explain4六、强制索引:5七、为排序创建索引:5八、实例讲解:5mongodb索引规则基本上与传统的关系库一样,大部分优化MySQL/Oracle/SQLite索引的技巧也适用于mongodb。一、 为什么用索引:当查询中用到某些条件时,可以对该键建立索引,以提高查询速度。二、 索引管理:a) 查询索引:i. 查询已有索引的明细:查询索引很简单,比如说需要查询mailaccess数据库中的Mail collection上的索引时:mongo 进入mongoMongoDB shell version: 1.8.1 connecting to: test use mailaccess 进入mailaccess databaseswitched to db mailaccess db.Mail.getIndexes() 查询索引明细 name : _id_, ns : mailaccess.Mail, key : _id : 1 , v : 0 , _id : ObjectId(4df063ac48857df7ac35c348), ns : mailaccess.Mail, key : user : 1, folderId : 1, mailfilename : 1 , name : user_1_folderId_1_mailfilename_1, v : 0 , ii. 查询索引大小: db.Mail.totalIndexSize() 查询索引大小114688索引所占大小,单位:字节b) 创建索引:db.Mail.ensureIndex(user:1,folderId:1,mailfilename:1)该命令会在Mail上创建一索引,默认索引名称的规则为:Keyname1_dir1_keyname2_dir2,如果该索引的默认名称:user_1_folderId_1_mailfilename_1其中:1表示升序 -1表示降序要是索引键很多时,最好自定义名称,如:定义名称为:index1db.Mail.ensureIndex(user:1,folderId:1,mailfilename:1 ,name:index1)c) 删除索引:如需删除名称为index1的索引:db.Mail.dropIndex(index)如需删除Mail中的所有索引时:db.Mail.dropIndex(*) _id索引不会删除还有一种方式是删除collection,collection中的所以索引也会消失,注意:_id索引也会被删除。(删除collection中的数据不会删除索引)d) 修改索引:Mongodb没有单独的修改索引的方法,如果需要修改某个索引,需要先删除旧有的索引,再创建新的索引。随着数据量的不断增长,你可能会发现某个collection需要修改索引或增加索引,此时创建索引就会很费力了,同时也很消耗性能。创建索引时mongodb默认是阻塞式,阻塞会让索引建立得更快,任何此期间的请求将不能响应。可以使用”background”:true选项在后台完成,同时也可能正常处理请求。不过这种方式也会造成请求的响应很慢。如果非紧急情况,最好在晚上统一处理。三、 索引种类:a) 默认索引:Mongodb每个collection都会有一个默认主键_id,这个不能删除、也不会更名。当collection创建后,系统会自动创建一个”_id_”的索引,这个也是无法删除与更名的。b) 单列索引:在单个栏位上创建的索引,比如,需要对Mail的read创建升序索引:db.Mail.ensureIndex(read:1)c) 组合索引:对多个键创建的索引,比如,需要对Mail的user与folderId创建降序索引:db.Mail.ensureIndex(user:-1,folderId:-1)d) 子文档索引:可以为内嵌文档的键创建索引,这种与普通索引没有什么区别,比如:需要对Mail中的attachments下的filename创建索引:db.Mail.ensureIndex(attachments.filename:1)注意:attachments.filename必须位于之中,否则会报错e) 唯一索引:唯一索引可能确保collection的每一个document指定的键的唯一性。当文档不存在指定键时,会被认为键值是“null”,所以“null”也会被认为是重复的,所以一般被作为唯一索引的键,最好都要有键值对。比如:要保证Mail中每个用户的mailfilename的唯一性:db.Mail.ensureIndex(user:1,filename:1,name:index1,unique:true)当为已有的collection增加唯一索引时,可能会有数据已经重复了。有时候可能希望将所有包含重复的文档都删除,可能在创建唯一索引时,使用dropDups选项:db.Mail.ensureIndex(user:1,filename:1,unique:true,dropDups:true)这个会将重复的数据只保留一份,不过有点鲁莽,如果数据很重要的话,建议不好这样做。注意了:Insert并不检查文档是否插入过,所以确保数据的唯一性,可能要用安全模式插入才行。这样,在插入时,如果有重复就会有错误提醒f) Sparse索引:Sparse index解决索引文件过大的问题,有时候我们要索引的某个属性并非是所有记录都有,普通的索引是将所有的记录都包含进来,而sparse索引则仅包含含有这个属性的记录,它不会对该项值为空的行作索引。这样就大大减小了某些列的索引大小。目前的限制是,sparse index只能包含一个属性。比如:在Mail中有个标签属性labels,这个属性是唯一的,且有值的情况也不多,这种情况就最适合用sparse索引了,创建索引的命令为:db.Mail.ensureIndex(labels:1,sparse:true)g) Covered 索引:如果你查找的值正好是在索引中,则可以直接返回索引中存的值,而不用到数据文件中查找。(这个在传统关系型数据库中也有实现),不过,必须满足以下条件: 必须提供准备的返回字段,以便可以直接从索引库中查询 必须明确地排除使用_id字段_id:0当用explain时,当indexOnly=true,表示有用到covered index:/ do a login with a covered index, returning the users roles/groups db.users.ensureIndex( username : 1, password : 1, roles : 1 ); db.users.save(username: joe, password: pass, roles: 2) db.users.save(username: liz, password: pass2, roles: 4) db.users.find(username: joe, _id: 0, roles: 1) roles : 2 db.users.find(username: joe, _id: 0, roles: 1).explain()cursor : BtreeCursor username_1_password_1_roles_1,.indexOnly : true,.四、 正则表达式在索引中的使用:正则表达式可以灵活地匹配查询条件,如果希望正则表达式能命中索引,就要注意了:Mongodb能为前缀型的正则表达式命中索引,比如:需要查询Mail中user以z开头的:/z/如果有user索引,这种查询很高效但其他的即使有索引,也不会命中索引,比说:需要查询Mail中的user中含有z的:/.*z.*/.*z.*/这种查询是不会命中到索引的,当数据量很大,速度很慢总之,后的条件必须明确,不能.* a-z之类开头的五、 索引分析:a) 索引命中:假设索引为:a:1,b:1,c:1,z:1:实际上是有了:a:1,a:1,b:1,a:1,b:1,c:1等索引的。但是使用b:1、a:1,c:1等索引的查询是会被优化的,只有使用索引前部的查询才能使用该索引。Mongodb的查询优化器会重排查询项的顺序,以便命中索引,比如:查询x:a,y:b的时候,如果已有了y:1,x:1的索引,mongodb也会自己找到并命中的。创建索引的缺点是每次插入、更新与删除时都会产生额外的开销,这是因为数据库不但需要执行这些操作,还是处理索引,因些,要尽量可能少创建索引。每个集合默认的最大索引个数为64个。b) 使用explaindb.collection.find(query).explain();返回的信息如下cursor : BasicCursor, indexBounds : , nscanned : 57594, nscannedObjects : 57594, nYields : 2 , n : 3 , millis : 108, indexOnly : false现实结果可以得知cursor的类型,DB扫描的数据数,返回的数据数,还有执行的毫秒数。cursor : BasicCursor:命中的索引,当为BasicCursor时表示没有命中任何索引indexBounds: 所使用的索引,被设置为表示为索引扫描的关键边界。nscanned - 扫描的数据条数。nscannedObjects - 扫描对象的数。nYields - 查询所产生的锁的个数。isMultiKey- MongoDB中提供了可以自动索引数组对象的值If true, a multikey index was used.n- 返回文档的数量millis- 数据库中执行查询的时间indexOnly - 是否使用了covered index。六、 强制索引:如果发现mongodb用了非预期的索引,可以用hint强制用某个索引,如:db.Mail.find(user:,folderId:inbox).hint(index1)多数情况下这种指定没有什么必要,mongodb会替你选择用哪个索引,初次查询时,查询优化器会同时尝试各种查询方案,最先完成的被确定使用,其他的则终止掉。查询方案也会记录下来,以备是后应对相同键的查询,查询优化器定期也重试其他的方案,以防因为添加新的数据后,之前的方案不再是最优的。七、 为排序创建索引:随着集合的增长,如果查询中有用到排序时,就要创建索引了。如果对没有索引的键用sort,mongodb需要将所有的数据提到内存中进行排序,这个是很影响性能的。八、 实例讲解:以MA的获取邮件列表为例,索引为:user:1,folderId:1,sendTime:-1,read:1,sourceSystem:1,importantFlag:1,name:folder_list_index需要用到的查询条件组合(都需要以sendTime降序排列):user:1,folderId:1,read:1,sourceSystem:1,importantFlag:1user:1,folderId:1, read:1,sourceSystem:1user:1,folderId:1,read:1user,folderId, sourceSyst
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 交通银行2025洛阳市秋招无领导模拟题角色攻略
- 工商银行2025铜川市秋招笔试创新题型专练及答案
- 中国银行2025齐齐哈尔市秋招群面模拟题及高分话术
- 农业银行2025绵阳市秋招群面案例总结模板
- 农业银行2025德阳市秋招群面案例总结模板
- 农业银行2025甘南藏族自治州秋招面试典型题目及参考答案
- 年日用百货购销合同2篇
- 建设银行2025随州市金融科技岗笔试题及答案
- 中国银行2025宿州市秋招群面模拟题及高分话术
- 工商银行2025廊坊市小语种岗笔试题及答案
- 2025年中国电信校招试题及答案
- 《建筑工程资料管理》高职土建类相关专业全套教学课件
- 【物理】2025届安徽省普通高中高三下学期高考全真模拟训练(三)试题(解析版)
- 消防队伍管酒治酒课件
- 自然保护区巡护监测员技能测试题库及答案
- 2025年中铁特货物流股份有限公司招聘笔试参考题库附带答案详解
- 中国风设计元素课件
- 陕西省西工大附中2022-2023学年七年级上学期第一次月考英语试卷(含答案)
- 职业等级考评员培训课件
- 2025至2030全球及中国细胞培养行业产业运行态势及投资规划深度研究报告
- 2025年《党政机关厉行节约反对浪费条例》应知应会测试考试题库
评论
0/150
提交评论