【第四章】MongoDB的索引介绍
【第四章】MongoDB的索引介绍
db第四章:mongoDB的索引介绍
标签(空格分隔): mongoDB
db.user.ensureIndex({age:1}) 创建索引 db.user.getIndexes() 查询索引
索引的种类
- _id索引 
- 单键索引 
- 多建索引 
- 复合索引 
- 过期索引 
- 全文索引 
- 地理位置索引 
索引的属性
创建索引的格式:db.table.ensureIndex({param},{param}),其中第二个参数便是索引的属性
比较重要的属性有:
- name(名字):mongoDB会自动给索引创建一个名字,可以自定义索引的名字 - db.imooc.ensureIndex({ss:1,dd:-1},{name:"myindex"})
- 可以通过索引的名字删除索引 - db.imooc.dropIndex("myindex")
 
- unique(唯一性): - db.imooc.ensureIndex({},{unique:true/false})
 
- sparse(稀疏性):默认false - true:只为存在的字段创建索引,false:索引字段不存在,任然保留索引 
- db.table.ensureIndex({},{sparse:true/false})
 
- expireAfterSeconds(是否定时删除) - TTL,过期索引 
 
_id索引
- _id索引是绝大多数集合(表)默认建立的索引 
- 对于美插入的数据,mongoDB都会自动生成一条唯一的_id索引 
单键索引
- 单键索引是最普通的索引 
- 与_id索引不同,单键索引不会自动创建 - db.imooc.ensureIndex({x:1})
多建索引
- 多建索引与单键索引创建的形式相同,区别在于字段的值 - 单键索引:值为单一的值,例如字符串,数字或者日期 
- 多建索引:值具有多个记录,例如数组 
- db.imooc.insert({x:[1,2,3,4,5]}) 
 
复合索引
- db.imooc.insert({x:1,y:2,z:3}) 
- db.imooc.ensureIndex({x:1,y:2}) 
- db.imooc.find({x:1,y:2}) 
过期索引
- 在一段时间后,会过期的索引 
- 在索引过期后,相应的数据也会被删除 
- 这适合存储一些在一段时间后会失效的数据,比如用户的登录信息,存储日志 
- 建立方法,db.collection.ensureIndex({time:1},{expireAfterSeconds:10})单位秒 
- 存储在过期索引字段的值必须是指定的时间类型(必须是ISODate或者ISODate数组,不能是时间戳,否则不能被自动删除) 
- 如果指定了ISODate数组,则按照最小的时间进行删除 
- 过期索引不能是复合索引(不能有两个过期时间) 
- 删除时间不是精确的(删除程序在后台每60s跑一次,而且删除需要时间,所以存在误差) 
全文索引
一张表中只允许创建一个全文索引
- 全文索引:对字符串与字符串数组创建全文可搜索的索引 
- 使用情况:{author:"",title:"",article:""} 
- 创建方法: - db.table.ensureIndex({"$**":"text"})
- db.table.ensureIndex({key:"text"})
- db.table.ensureIndex({key_1:"text",key_2:"text"})
 
- 查询方法 - db.table.find({$text:{$search:"coffee"}})
- db.table.find({$text:{$search:"aa bb cc"}})包含aa或bb或cc
- db.table.find({$text:{$search:"aa bb -cc"}})包含aa或bb不包含cc的
- db.table.find({$text:{$search:"\"aa\" \"bb\" \"cc\""}})用引号引起来,既包含aa又包含bb又包含cc
 
- 全文索引相似度 - 命令: - db.imooc.find({$text:{$search:"aa cc"}},{score:{$meta:"textScore"}})
- 根据相似度排序: - db.imooc.find({$text:{$search:"aa cc"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}})
 
- 全文索引限制 - 每次查询只能制定一个$text查询 
- $text查询不能出现在$nor查询 
- 查询中如果包含了$text,hint不再起作用(hint强制指定索引) 
- 很可惜,mongoDB全文索引不支持中文 
 
地理位置索引
概念:
将一些点的位置存储在mongoDB中,创建索引后,可以按照位置来查找其他点
子分类:
- 2d索引,用于存储和查找平面上的点 - 创建方式: - db.table.ensureIndex({fieldName:"2d"})
- 插入地理位置数据 - db.location.insert({w:[50,10]})
- 查询距离某个点最近的点: - $near,- db.location.find({w:{$near:[1,1],$maxDistance:10}})
- 查询某个形状内的点: - $geoWithin
 
- 2dsphere索引,用于存储和查找球面上的点 
- 创建方式: - db.table.ensureIndex({fieldName:"2dsphere"})- 位置标示方式:geoJSON:描述一个点,一条直线,多边形形状 - 格式:{type:"",coordinates:[]} 
 
 
索引构建情况分析
- mongostat工具介绍 
- profile集合介绍 
- 日志介绍 
- explain分析 
Last updated
Was this helpful?
