建立索引可以提升数据查找的速度。 基本语法格式如下所示:
db.collection.createIndex(keys, options) db.col.createIndex({"title":1})keys对象参数为1表示正序建立索引,-1表示逆序建立索引。如果添加多个属性为联合索引。
options可选属性如下表:
其他索引操作:
1、查看集合索引 db.col.getIndexes()
2、查看集合索引大小 db.col.totalIndexSize()
3、删除集合所有索引 db.col.dropIndexes()
4、删除集合指定索引 db.col.dropIndex(“索引名称”)
设置定时删除任务 利用 TTL 集合对存储的数据进行失效时间设置:经过指定的时间段后或在指定的时间点过期,MongoDB 独立线程去清除数据。
例如在数据记录中 createDate 为日期类型之后180删除: db.col.createIndex({“createDate”: 1},{expireAfterSeconds: 180}) 由记录中设定日期点清除:使用{expireAfterSeconds: 0}
其他注意事项: • 索引关键字段必须是 Date 类型。 • 非立即执行:扫描 Document 过期数据并删除是独立线程执行,默认 60s 扫描一次,删除也不一定是立即删除成功。 • 单字段索引,混合索引不支持。
1.创建简单索引
数据准备index.js 1.先检验一下查询性能 var start = new Date() db.books.find({number:65871}) var end = new Date() end - start 2.为number 创建索引 db.books.ensureIndex({number:1}) 3.再执行第一部的代码可以看出有数量级的性能提升2.索引使用需要注意的地方
1.创建索引的时候注意1是正序创建索引-1是倒序创建索引 2.索引的创建在提高查询性能的同事会影响插入的性能 对于经常查询少插入的文档可以考虑用索引 3.符合索引要注意索引的先后顺序 4.每个键全建立索引不一定就能提高性能呢索引不是万能的 5.在做排序工作的时候如果是超大数据量也可以考虑加上索引用来提高排序的性能3.索引的名称
3.1用VUE查看索引名称 3.2创建索引同时指定索引的名字 db.books.ensureIndex({name:-1},{name:”bookname”})4.唯一索引
4.1如何解决文档books不能插入重复的数值 建立唯一索引 db.books.ensureIndex({name:-1},{unique:true}) 试验 db.books .insert({name:”1book”})5.踢出重复值
5.1如果建议唯一索引之前已经有重复数值如何处理 db.books.ensureIndex({name:-1},{unique:true,dropDups:true})6.Hint
6.1如何强制查询使用指定的索引呢? db.books.find({name:"1book",number:1}).hint({name:-1}) 指定索引必须是已经创建了的索引7.Expain
7.1如何详细查看本次查询使用那个索引和查询数据的状态信息 db.books.find({name:"1book"}).explain() “cursor” : “BtreeCursor name_-1“ 使用索引 “nscanned” : 1 查到几个文档 “millis” : 0 查询时间0是很不错的性能1.system.indexes
1.1在shell查看数据库已经建立的索引 db.system.indexes.find() db.system.namespaces.find()2.后台执行
2.1执行创建索引的过程会暂时锁表问题如何解决? 为了不影响查询我们可以叫索引的创建过程在后台 db.books.ensureIndex({name:-1},{background:true})3.删除索引
3.1批量和精确删除索引 db.runCommand({dropIndexes : ”books” , index:”name_-1”}) db.runCommand({dropIndexes : ”books” , index:”*”})1.mongoDB提供强大的空间索引可以查询出一定范围的地理坐标.看例子 准备数据map.json 1.查询出距离点(70,180)最近的3个点 添加2D索引 db.map.ensureIndex({“gis”:“2d”},{min:-1,max:201})
默认会建立一个[-180,180]之间的2D索引 查询点(70,180)最近的3个点
db.map.find({"gis":{$near:[70,180]}},{gis:1,_id:0}).limit(3)2.查询以点(50,50)和点(190,190)为对角线的正方形中的所有的点
db.map.find({gis:{"$within":{$box:[[50,50],[190,190]]}}},{_id:0,gis:1})3.查询出以圆心为(56,80)半径为50规则下的圆心面积中的点
db.map.find({gis:{$within:{$center:[[56,80],50]}}},{_id:0,gis:1})