当前位置:Gxlcms > 数据库问题 > 3、mongoDB索引

3、mongoDB索引

时间:2021-07-01 10:21:17 帮助过:9人阅读

创建索引: db.imooc_collection.getIndexes() 查看索引情况 db.imooc_collection.ensureIndex({x:1}) 创建索引,x:1代表正向排序,x:-1代表逆向排序 db.imooc_collection.dropIndex("normal_index") 删除索引,normal_index为索引名     索引的种类: 1._id索引 2.单键索引 3.多键索引 4.复合索引 5.过期索引 6.全文索引 7.地理位置索引     1._id索引: _id索引是绝大多数集合默认建立的索引 对于每个插入的数据,mongoDB都会自动生成一条唯一的_id字段 会自动创建         2.单键索引: 单键索引是最普通的索引 例如:一条记录,形式为:{x:1,y:2,z:3} 我们在x字段上加条索引,之后就可以以x为条件进行查询 db.imooc_collection.ensureIndex({x:1})           3.多键索引: 多件索引和单键索引创建形式相同,区别在于字段的值 单键索引:值为一个单一的值,例如字符串,数字或者日期。 多键索引:值具有多个记录,例如数组。 db.imoc_collection.insert({x:[1,2,3,4,5,6,7,8,9]}) 对于这组数据来讲,mongoDB便为x创建了多键索引             4.复合索引: 当我们的查询条件只有一个时,就需要建立复合索引 插入{x:1,y:2,z:3}记录-->按照x与y的值查询-->db.collection.ensureIndex({x:1,y:2})-->使用{x:1,y:2}作为条件进行查询             5.过期索引: 1.是在一段时间后会过期的索引。 2.在索引过期后,相应的数据会被删除。 3.这适合存储一些在一段时间之后会失效的数据,比如用户的登陆信息、存储的日志。 4.建立方法: db.collection.ensureIndex({time:1},{expireAfterSeconds:10}) {time:1},需要索引的字段 {expireAfterSeconds:10},设置过期时间,单位为秒   db.collection.insert({time:new Date()}) 将当前时间插入进time列,检验是否10秒过后会自动删除   过期索引的限制: 1.存储在过期索引字段的值必须是指定的时间类型。 说明:必须是ISODate或者ISODate数组,不能使用时间戳,否则不能被自动删除 2.如果指定了ISODate数组,则按照最小的时间进行删除。 3.过期索引不能是复合索引。 4.删除时间不精确。 说明:删除过程是由后台程序每60秒跑一次,而且删除也需要一些时间,所以存在误差。                 6.全文索引: 对字符串与字符串数组创建全文可搜索的索引 适用情况: {author:"",titile:"",article:""} 建立方法: db.articles.ensureIndex({key:"text"}) db.articles.ensureIndex({key_1:"text",key_2:"text"}) db.articles.ensureIndex({"$**":"text"}) db.imooc_2.ensureIndex({"article":"text"}) 以article为key创建全文索引 如何使用全文索引进行查询: 先插入几条数据: db.imooc_2.insert({"article":"aa bb cc dd ee ff gg"}) db.imooc_2.insert({"article":"aa bb cc rr mm nn oo"}) db.imooc_2.insert({"article":"aa bb qrwq qw ww tt yy"}) db.imooc_2.insert({"article":"aa bb cc zz ii uu hh"}) db.imooc_2.insert({"article":"aa bb cc xx vv kk jj"}) 再进行全文索引查询: db.imooc_2.find({$text:{$search:"aa"}}) db.imooc_2.find({$text:{$search:"aa bb cc"}})======》默认是或查询,只要包含aa或者bb或者cc都会查询出来 db.imooc_2.find({$text:{$search:"aa bb -cc"}})======》-cc代表不包含cc这个字符串 db.imooc_2.find({$text:{$search:"\"aa\"\"bb\" \"cc\""}})======》与操作,既包含aa又包含bb又包含cc的字段查询出来,因为$search:的外面本来就有个双引号,所以这个里面需要用反斜杠将里面的双引号进行转意       全文索引相似度查询: $meta操作符:{score:{$meta:"textScore"}}------>{$meta:"textScore"}是一个数值,代表与所查询条件的匹配度多少,值越高代表相似度越高,score只是用于显示的,可以改变,如:fenshu,随便你(最好就用score吧) 写在查询条件后面可以返回返回结果的相似度 与sort一起使用,可以达到很好的实用效果。 例:db.imooc_2.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}}) 这条语句将会查找出包含 aa或者bb的字段并且按期相似度从高到低排序         全文索引的使用限制: 全文索引虽然非常强大,但是同样存在限制: 1.每次查询,只能指定一个$text查询 2.$text查询不能出现在$nor查询中 3.查询中如果包含了$text,hint不再起作用 4.MongoDB全文索引目前还不支持中文     索引属性----name指定 创建索引时的格式: db.collection.ensureIndex({param},{param}) 其中,第二个参数便是索引的属性。 比较重要的属性有: 名字,name指定: db.collection.ensureIndex({x:1},{name:"normal_index"}) 唯一性,unique指定: db.collection.ensureIndex({x:1},{unique:true/false}) 稀疏性,sparse指定: db.collection.ensureIndex({x:1},{sparse:true/false}) 是否定时删除,expireAfterSeconds指定: db.collection.ensureIndex({x:1},{expireAfterSeconds:10})         7.地利位置索引: 概念:将一些点的位置存储在mongoDB中,创建索引后,可以按照位置来查找其他点。 子分类:2d索引,用于存储和查找平面上的点 2dsphere索引,用于存储和查找球面上的点 查找方式: 1.查找距离某个点一定距离内的点 2.查找包含在某区域内的点     2d索引:平面地理位置索引 创建方式:db.location.ensureIndex({"w":"2d"}) 位置表示方式:经纬度[经度,纬度] 取值范围:经度[-180,180]纬度[-90,90] 先插入几条数据: db.location.insert({w:[1,2]}) db.location.insert({w:[4,3]}) db.location.insert({w:[6,5]}) db.location.insert({w:[120,50]}) 查询方式: (1).$near查询:查询距离某个点最近的点 例: db.location.find({w:{$near:[1,1],$maxDistance:10}}) $maxDistance用来设定最大距离 (2).$geoWithin查询:查询某个形状内的点 形状的表示: 1.$box:矩形,使用 {$box:[[<x1>,<y1>],[<x2>,<y2>]]}表示 例: db.location.find({w:{$geoWithin:{$box:[[0,0],[3,3]]}}})   2.$center:圆形,使用 {$center:[[<x1>,<y1>],r]}表示 例: db.location.find({w:{$geoWithin:{$center:[[0,0],5]}}})   3.$polygon:多边形,使用 {$polygon:[[<x1>,<y1>],[<x2>,<y2>],[<x3>,<y3>]]}表示 例: db.location.find({w:{$geoWithin:{$polygon:[[0,0],[0,1],[2,5],[6,1]]}}}) (3).geoNear查询: geoNear使用runCommand命令进行使用,常用使用如下: db.runCommand( {geoNear:<collection>, near:[x,y], minDistance:(对2d索引无效) maxDistance: num: ...}) 例: db.runCommand({geoNear:"location",near:[1,2],maxDistance:10,num:1})     2dsphere索引: 概念:球面地理位置索引 创建方式:db.collection.ensureIndex({w:"2dsphere"})   位置表示方式: GeoJSON:描述一个点,一条直线,多边形等形状。 格式: {type:" ",coordinates:[<coordinates>]}   查询方式与2d索引查询方式类似, 支持$minDistance与$maxDistance   索引构建情况分析: 索引好处:加快索引相关的查询 索引不好处:增加磁盘空间消耗,降低写入性能     如何评判当前索引构建情况: 1.mongostat工具介绍 mongostat:查看mongodb运行状态的程序 使用说明:mogostat -h 127.0.0.1:12345 字段说明: 索引情况:idx miss 索引丢失的情况,如果很高,说明我们创建的索引有问题 切换到mongoDB的bin目录 ./mongostat --help 查看帮助 一般我们比较关心的段: 这几个值都是越低代表性能越好 qr:读队列 qw:写队列 idx miss:   2.profile集合介绍 db.getProfilingStatus() 查看profile的状态 db.getProfilingLevel() 查看profile的级别 级别分别为0,1,2 0级别 profile是关闭的,不记录任何操作 1级别 配合slowms的域值,记录所有操作超过slowms的操作 2级别 记录所有操作   设置profile级别: db.setprofilingLevel(2) 设置之后使用show tables会发现mongoDB的表里会新增一个System.profile的表,用来记录我们对mongoDB的操作 我们使用 db.system.profile.find().sort({$natural:-1}).limit(1) $natural用来指定以时间先后排序,-1代表最近的操作,1代表最远的操作。     3.日志介绍 log/mongod.log   4.explain分析 db.imooc_2.find({x:1}).explain()-------->可以用来查看你的这个特定查看是否使用索引,会显示你的查询的详细信息  

3、mongoDB索引

标签:auth   如何使用   限制   tab   直线   生成   font   hit   适合   

人气教程排行