索引通常能够极大的提高查询的效率。在系统中使用查询时,应该考虑建立相关的索引。MRsHTML5中文学习网 - HTML5先行者学习网
索引是一种数据结构,他搜集一个集合中文档特定字段的值。MongoDB的查询优化器能够MRsHTML5中文学习网 - HTML5先行者学习网
使用这种数据结构来快速的对集合(collection)中的文档(collection)进行寻找和排序,MRsHTML5中文学习网 - HTML5先行者学习网
准确来说,这些索引是通过B-Tree索引来实现的。MRsHTML5中文学习网 - HTML5先行者学习网
1.创建简单索引MRsHTML5中文学习网 - HTML5先行者学习网
数据准备index.js,创建books文档并插入200000条数据,如下:MRsHTML5中文学习网 - HTML5先行者学习网
for(var i=0;i<200000;i++){MRsHTML5中文学习网 - HTML5先行者学习网
db.books.insert({number:i,name:i+"book"})MRsHTML5中文学习网 - HTML5先行者学习网
}MRsHTML5中文学习网 - HTML5先行者学习网
1.先检验一下查询性能MRsHTML5中文学习网 - HTML5先行者学习网
var start = new Date()MRsHTML5中文学习网 - HTML5先行者学习网
db.books.find({number:65871})MRsHTML5中文学习网 - HTML5先行者学习网
var end = new Date()MRsHTML5中文学习网 - HTML5先行者学习网
end - startMRsHTML5中文学习网 - HTML5先行者学习网
2.为number 创建索引MRsHTML5中文学习网 - HTML5先行者学习网
db.books.ensureIndex({number:1})MRsHTML5中文学习网 - HTML5先行者学习网
3.再执行第一部的代码可以看出有数量级的性能提升MRsHTML5中文学习网 - HTML5先行者学习网
2.索引使用需要注意的地方MRsHTML5中文学习网 - HTML5先行者学习网
1.创建索引的时候注意1是正序创建索引-1是倒序创建索引MRsHTML5中文学习网 - HTML5先行者学习网
2.索引的创建在提高查询性能的同事会影响插入的性能对于经常查询少插入的文档可以考虑用索引MRsHTML5中文学习网 - HTML5先行者学习网
3.符合索引要注意索引的先后顺序MRsHTML5中文学习网 - HTML5先行者学习网
4.每个键全建立索引不一定就能提高性能呢索引不是万能的MRsHTML5中文学习网 - HTML5先行者学习网
5.在做排序工作的时候如果是超大数据量也可以考虑加上索引用来提高排序的性能MRsHTML5中文学习网 - HTML5先行者学习网
3.创建索引同时指定索引的名字MRsHTML5中文学习网 - HTML5先行者学习网
db.books.ensureIndex({name:-1},{name:”bookname”})MRsHTML5中文学习网 - HTML5先行者学习网
4.唯一索引MRsHTML5中文学习网 - HTML5先行者学习网
4.1如何解决文档books不能插入重复的数值MRsHTML5中文学习网 - HTML5先行者学习网
建立唯一索引MRsHTML5中文学习网 - HTML5先行者学习网
db.books.ensureIndex({name:-1},{unique:true})MRsHTML5中文学习网 - HTML5先行者学习网
试验MRsHTML5中文学习网 - HTML5先行者学习网
db.books .insert({name:”1book”})MRsHTML5中文学习网 - HTML5先行者学习网
5.剔除重复值MRsHTML5中文学习网 - HTML5先行者学习网
5.1如果建议唯一索引之前已经有重复数值如何处理MRsHTML5中文学习网 - HTML5先行者学习网
db.books.ensureIndex({name:-1},{unique:true,dropDups:true})MRsHTML5中文学习网 - HTML5先行者学习网
6.HintMRsHTML5中文学习网 - HTML5先行者学习网
6.1如何强制查询使用指定的索引呢?MRsHTML5中文学习网 - HTML5先行者学习网
db.books.find({name:"1book",number:1}).hint({name:-1})MRsHTML5中文学习网 - HTML5先行者学习网
指定索引必须是已经创建了的索引MRsHTML5中文学习网 - HTML5先行者学习网
7.ExpainMRsHTML5中文学习网 - HTML5先行者学习网
7.1如何详细查看本次查询使用那个索引和查询数据的状态信息MRsHTML5中文学习网 - HTML5先行者学习网
db.books.find({name:"1book"}).explain()MRsHTML5中文学习网 - HTML5先行者学习网
返回结果,如下所示:MRsHTML5中文学习网 - HTML5先行者学习网
> db.books.find({name:"1book"}).explain()MRsHTML5中文学习网 - HTML5先行者学习网
{MRsHTML5中文学习网 - HTML5先行者学习网
"cursor" : "BtreeCursor name_1",MRsHTML5中文学习网 - HTML5先行者学习网
"isMultiKey" : false,MRsHTML5中文学习网 - HTML5先行者学习网
"n" : 1,MRsHTML5中文学习网 - HTML5先行者学习网
"nscannedObjects" : 1,MRsHTML5中文学习网 - HTML5先行者学习网
"nscanned" : 1,MRsHTML5中文学习网 - HTML5先行者学习网
"nscannedObjectsAllPlans" : 1,MRsHTML5中文学习网 - HTML5先行者学习网
"nscannedAllPlans" : 1,MRsHTML5中文学习网 - HTML5先行者学习网
"scanAndOrder" : false,MRsHTML5中文学习网 - HTML5先行者学习网
"indexOnly" : false,MRsHTML5中文学习网 - HTML5先行者学习网
"nYields" : 0,MRsHTML5中文学习网 - HTML5先行者学习网
"nChunkSkips" : 0,MRsHTML5中文学习网 - HTML5先行者学习网
"millis" : 0,MRsHTML5中文学习网 - HTML5先行者学习网
"indexBounds" : {MRsHTML5中文学习网 - HTML5先行者学习网
"name" : [MRsHTML5中文学习网 - HTML5先行者学习网
[MRsHTML5中文学习网 - HTML5先行者学习网
"1book",MRsHTML5中文学习网 - HTML5先行者学习网
"1book"MRsHTML5中文学习网 - HTML5先行者学习网
]MRsHTML5中文学习网 - HTML5先行者学习网
]MRsHTML5中文学习网 - HTML5先行者学习网
},MRsHTML5中文学习网 - HTML5先行者学习网
"server" : "PC-20110917QHJT:27017"MRsHTML5中文学习网 - HTML5先行者学习网
}MRsHTML5中文学习网 - HTML5先行者学习网
"cursor" : "BtreeCursor name_1" 使用索引MRsHTML5中文学习网 - HTML5先行者学习网
"nscanned" : 1 查到几个文档MRsHTML5中文学习网 - HTML5先行者学习网
"millis" : 0 查询时间,0是很不错的性能MRsHTML5中文学习网 - HTML5先行者学习网
二、索引管理MRsHTML5中文学习网 - HTML5先行者学习网
8、system.indexesMRsHTML5中文学习网 - HTML5先行者学习网
8.1、在shell中,查看数据库已经建立的索引。如下:MRsHTML5中文学习网 - HTML5先行者学习网
db.system.indexes.find()MRsHTML5中文学习网 - HTML5先行者学习网
db.system.namespaces.find()MRsHTML5中文学习网 - HTML5先行者学习网
9、后台执行MRsHTML5中文学习网 - HTML5先行者学习网
9.1、执行创建索引的过程会暂时锁表问题,如何解决?MRsHTML5中文学习网 - HTML5先行者学习网
为了不影响查询,我们可以让索引的创建过程在后台执行。MRsHTML5中文学习网 - HTML5先行者学习网
db.books.ensureIndex({number:1},{true})MRsHTML5中文学习网 - HTML5先行者学习网
10、删除索引MRsHTML5中文学习网 - HTML5先行者学习网
10.1、批量和精确删除索引MRsHTML5中文学习网 - HTML5先行者学习网
db.runCommand({dropIndexes:"books",index:"name_1"}) 精确删除索引MRsHTML5中文学习网 - HTML5先行者学习网
db.runCommand({dropIndexes:"books",index:"*"}) 批量删除索引MRsHTML5中文学习网 - HTML5先行者学习网
三、空间索引MRsHTML5中文学习网 - HTML5先行者学习网
11、mongoDB提供强大的空间索引,可以查询出一定范围的地理坐标。示例如下:MRsHTML5中文学习网 - HTML5先行者学习网
准备数据map.txt,如下图:MRsHTML5中文学习网 - HTML5先行者学习网
var map = [{MRsHTML5中文学习网 - HTML5先行者学习网
"gis" : {MRsHTML5中文学习网 - HTML5先行者学习网
"x" : 185,MRsHTML5中文学习网 - HTML5先行者学习网
"y" : 150MRsHTML5中文学习网 - HTML5先行者学习网
}MRsHTML5中文学习网 - HTML5先行者学习网
},{MRsHTML5中文学习网 - HTML5先行者学习网
"gis" : {MRsHTML5中文学习网 - HTML5先行者学习网
"x" : 70,MRsHTML5中文学习网 - HTML5先行者学习网
"y" : 180MRsHTML5中文学习网 - HTML5先行者学习网
}MRsHTML5中文学习网 - HTML5先行者学习网
},{MRsHTML5中文学习网 - HTML5先行者学习网
"gis" : {MRsHTML5中文学习网 - HTML5先行者学习网
"x" : 75,MRsHTML5中文学习网 - HTML5先行者学习网
"y" : 180MRsHTML5中文学习网 - HTML5先行者学习网
}MRsHTML5中文学习网 - HTML5先行者学习网
},{MRsHTML5中文学习网 - HTML5先行者学习网
"gis" : {MRsHTML5中文学习网 - HTML5先行者学习网
"x" : 185,MRsHTML5中文学习网 - HTML5先行者学习网
"y" : 185MRsHTML5中文学习网 - HTML5先行者学习网
}MRsHTML5中文学习网 - HTML5先行者学习网
},{MRsHTML5中文学习网 - HTML5先行者学习网
"gis" : {MRsHTML5中文学习网 - HTML5先行者学习网
"x" : 65,MRsHTML5中文学习网 - HTML5先行者学习网
"y" : 185MRsHTML5中文学习网 - HTML5先行者学习网
}MRsHTML5中文学习网 - HTML5先行者学习网
},{MRsHTML5中文学习网 - HTML5先行者学习网
"gis" : {MRsHTML5中文学习网 - HTML5先行者学习网
"x" : 50,MRsHTML5中文学习网 - HTML5先行者学习网
"y" : 50MRsHTML5中文学习网 - HTML5先行者学习网
}MRsHTML5中文学习网 - HTML5先行者学习网
},{MRsHTML5中文学习网 - HTML5先行者学习网
"gis" : {MRsHTML5中文学习网 - HTML5先行者学习网
"x" : 50,MRsHTML5中文学习网 - HTML5先行者学习网
"y" : 50MRsHTML5中文学习网 - HTML5先行者学习网
}MRsHTML5中文学习网 - HTML5先行者学习网
},{MRsHTML5中文学习网 - HTML5先行者学习网
"gis" : {MRsHTML5中文学习网 - HTML5先行者学习网
"x" : 60,MRsHTML5中文学习网 - HTML5先行者学习网
"y" : 55MRsHTML5中文学习网 - HTML5先行者学习网
}MRsHTML5中文学习网 - HTML5先行者学习网
},{MRsHTML5中文学习网 - HTML5先行者学习网
"gis" : {MRsHTML5中文学习网 - HTML5先行者学习网
"x" : 65,MRsHTML5中文学习网 - HTML5先行者学习网
"y" : 80MRsHTML5中文学习网 - HTML5先行者学习网
}MRsHTML5中文学习网 - HTML5先行者学习网
},{MRsHTML5中文学习网 - HTML5先行者学习网
"gis" : {MRsHTML5中文学习网 - HTML5先行者学习网
"x" : 55,MRsHTML5中文学习网 - HTML5先行者学习网
"y" : 80MRsHTML5中文学习网 - HTML5先行者学习网
}MRsHTML5中文学习网 - HTML5先行者学习网
},{MRsHTML5中文学习网 - HTML5先行者学习网
"gis" : {MRsHTML5中文学习网 - HTML5先行者学习网
"x" : 0,MRsHTML5中文学习网 - HTML5先行者学习网
"y" : 0MRsHTML5中文学习网 - HTML5先行者学习网
}MRsHTML5中文学习网 - HTML5先行者学习网
},{MRsHTML5中文学习网 - HTML5先行者学习网
"gis" : {MRsHTML5中文学习网 - HTML5先行者学习网
"x" : 0,MRsHTML5中文学习网 - HTML5先行者学习网
"y" : 200MRsHTML5中文学习网 - HTML5先行者学习网
}MRsHTML5中文学习网 - HTML5先行者学习网
},{MRsHTML5中文学习网 - HTML5先行者学习网
"gis" : {MRsHTML5中文学习网 - HTML5先行者学习网
"x" : 200,MRsHTML5中文学习网 - HTML5先行者学习网
"y" : 0MRsHTML5中文学习网 - HTML5先行者学习网
}MRsHTML5中文学习网 - HTML5先行者学习网
},{MRsHTML5中文学习网 - HTML5先行者学习网
"gis" : {MRsHTML5中文学习网 - HTML5先行者学习网
"x" : 200,MRsHTML5中文学习网 - HTML5先行者学习网
"y" : 200MRsHTML5中文学习网 - HTML5先行者学习网
}MRsHTML5中文学习网 - HTML5先行者学习网
}]MRsHTML5中文学习网 - HTML5先行者学习网
for(var i = 0;iMRsHTML5中文学习网 - HTML5先行者学习网
db.map.insert(map[i])MRsHTML5中文学习网 - HTML5先行者学习网
}MRsHTML5中文学习网 - HTML5先行者学习网

首先,添加2D索引(默认会建立一个[-180,180]之间的2D索引)MRsHTML5中文学习网 - HTML5先行者学习网
db.map.ensureIndex({"gis":"2d"},{min:-1,max:201})MRsHTML5中文学习网 - HTML5先行者学习网
11.1、查询出距离点(70,180)最近的3个点MRsHTML5中文学习网 - HTML5先行者学习网
db.map.find({"gis":{$near:[70,180]}},{gis:1,_id:0}).limit(3)//$near操作符表示中心点;如果没有指定limit,其默认值为100。MRsHTML5中文学习网 - HTML5先行者学习网
11.2、查询以点(50,50)和(190,190)为对角线的正方形中的所有点MRsHTML5中文学习网 - HTML5先行者学习网
var box=[[50,50],[190,190]];//定义一个矩形区域MRsHTML5中文学习网 - HTML5先行者学习网
db.map.find({"gis":{"$within":{"$box":box}}},{gis:1,_id:0})//$box 矩形查找MRsHTML5中文学习网 - HTML5先行者学习网
11.3、查询出以圆心为(55,80),半径为50,规则下的圆心面积中的点MRsHTML5中文学习网 - HTML5先行者学习网
var center=[55,80];//定义中心点MRsHTML5中文学习网 - HTML5先行者学习网
var radius=50;//定义半径MRsHTML5中文学习网 - HTML5先行者学习网
db.map.find({"gis":{"$within":{"$center":[center,radius]}}});//$center 圆形查找(注意这里是数组传递)MRsHTML5中文学习网 - HTML5先行者学习网