基本操作
查看所有索引
数据库.表名.getIndexes()
创建索引
数据库.表名.ensureIndex({x:1})
数字的正负代表方向,1为正向排序,-1为倒序。如果文档数目较多,那么需要在创建数据库时,就应该完成索引的创建,而不是中途创建索引(系统开销及负重的缘故,否则会验证影响数据库的性能)
为x添加索引之后 ,我们再查询x时,时间就会缩短许多。因此在线上服务时,对于常见的查询,一定要在建库之初,就完成索引的创建工作。虽然多索引会对写入造成一定性能影响,但是相比于高效的查询结果,这些牺牲都是值得的。
种类
当数据量较大时,不使用索引会降低查询效率。mongoDB默认会有一个_id索引,自动生成。
mongo有如下的索引种类:
_id索引
- 绝大多数集合默认建立的索引
-对于每个插入的数据,mongoDB都会自动生成一条唯一的_id字段(保存数组对象时,每个对象也都会有一个_id)
单键索引
- 单键索引是最简单的索引,用于在某个字段上建立,例如一条记录;
{x:1,y:2,z:3}
在x上建立的索引就叫做单键索引。
- 与_id不同,单键索引不会自动创建
索引
多键索引
- 多键索引与单键索引创建的形式相同,区别在于字段的值
复合索引
过期索引
- 是指在一段时间后会过期的索引。
- 在索引过期后,相应的数据会被删除。
- 适合存储一些在一段时间之后会失效的数据,例如用户的登录信息、存储日志。
第二个参数为过期的时间,单位为秒。
全文索引
创建
可以看到创建全文索引和创建其他索引的形式类似,不同的是,创建全文索引的key指字段名称,value指固定的字符串。
- 上图的第一条,我们在article集合的key字段上创建了一个全文索引。
- 第二条演示了如何创建多个字段创建全文索引。
- 第三条对集合的所有字段创建全文索引
在每个集合中,只能创建一个全文索引
使用
假设我们创建了如下数据
可以使用如下命令进行全局查询:
- 第一条查询包含coffee的article
- 第二条是或查询,包含aa 或 bb 或 cc 的article
- 第三条是包含aa 或 bb ,但不包含 cc
- 第四条是且查询,用“”包裹要查询的文本,即可进行且查询,\”是双引号的转义操作
全文索引的相似度查询
例如:
此时查询结果就会包含score字段,即为当前文本与待查文本之间的相似度,得分越高表示越相似。接下来只需要对score字段进行排序,即可得到与待查文本相似度最高的数据。
使用限制
索引属性
在使用ensureIndex创建索引时,第二个参数就是索引的属性值。
属性—name,名称
即索引的名称
属性—unique,唯一性
当设置为true时,不允许在统一集合中查询两条相同的数据
例如:
第一条命令创建了m,n的唯一索引,也就是说该集合中不能存在两个完全一样的m和n,所以第二个操作会报错。
稀疏性
指定索引是否稀疏,默认创建的索引都是非稀疏的(false)。
稀疏性,sparse指定 什么是稀疏:mongodb在处理索引中存在在,文档中不存在的两种方法。 例如: x字段创建了索引,但是插入了一条数据中并没有x字段,默认mongodb会为这个不存在的字段创建索引 如果你不想这件事情发生,就设置sparse:true来避免。 不必为不存在的数据创建索引,如果文档中这个字段很多都没有值,会加快插入速度。 sparse:true是稀疏 false 不是稀疏 。 默认是不稀疏的,自行创建的索引都是不稀疏的。
所谓稀疏,就是当sparse为true且在记录中不存在该索引字段时,不用创建索引,所以节约了磁盘占用;而且插入时由于不用更新索引,所以也加快了插入速度
是否定时删除
也就是之前提及的过期索引
地理位置索引
所谓地理位置索引,就是指可以将一些点的位置存储在MongoDB中,创建索引后,可以按照位置来查找其他的点。
索引分内2类:
- 2d索引,用于存储和查找平面上的点
- 2dsphere索引,用于存储和查找球面上的点
查找方式也分为2中:
- 查找距离某个点一定距离的点
- 查找包含在某个区域内的点
2D索引
平面地理位置索引
创建位置信息:
- 使用near查询最近的点(100个)
可以使用maxDistance来约束结果集
- 使用geoWithin查询某个形状内的点
形状的表示方式:
由于2d索引比较复杂,后续内容将另开一篇文章专门讲解。
索引构建情况分析
笔者个人订阅号~欢迎小伙伴们关注