准备阶段
插入10W条数据测试准备:
MongoDB性能分析函数(explain)
cursor #查询方式 BasicCursor:顺序查找即“表扫描”
n #最终返回文档数量
nscanned #数据库浏览了10w个文档
millis #总共耗时50毫秒
查看索引
db.age.getIndexes()
命名索引
db.age.ensureIndex({"name":1},{name:"normal_index"})
删除索引
db.age.dropIndex("name_1")
创建索引
单键索引
db.age.ensureIndex({"name":1})
创建索引性能对比:
唯一索引
重复的键值自然就不能插入
db.age.ensureIndex({"name":1},{unique:true})
稀疏索引
没有此字段的数据不建立索引,节约磁盘
db.age.ensureIndex({"name":1},{sparse:true/false})
组合索引
db.age.ensureIndex({"name":1,"age":1})
db.age.ensureIndex({"age":1,"name":1})
过期索引
在一段时间后会过期的索引
在索引过期后,相应的数据会被删除
适合存储在一段时间之后会失效的数据,比如用户的登录信息、存储的日志等。
db.age.ensureIndex({time:1},{expireAfterSeconds:30}) #索引30秒后失效
db.age.insert({time:new Date()}) #time必须为ISODate或者ISODate数组,不能为时间戳
全文索引
创建
db.age.ensureIndex({key:"text"}) #key:字段名,value:固定字符串text
db.age.ensureIndex({key1:"text",key2:"text"}) #在多个字段上创建全文索引
db.age.ensureIndex({"$**":"text"}) #给所有字段建立全文索引
查询
db.age.find({$text:{$search:"coffee"}})
db.age.find({$text:{$search:"aa bb cc"}}) #空格代表或操作,aa或bb或cc
db.age.find({$text:{$search:"aa bb -cc"}}) #-号为非操作,即不包含cc的
db.age.find({$text:{$search: "\"aa\" \"bb\" \"cc\""}}) #""号为与操作,aa与bb与cc
查询返回相似度
db.age.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}})
db.age.find({$text:{$search:"aa bb"}},{score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}}) #返回相似度并排序
全局索引的限制:
- 每次查询,只能指定一个$text查询
- 不能出现在$nor查询中
- 查询中如果包含了$text, hint(强制指定索引)不再起作用
- MongoDB全文索引还不支持中文
地理位置索引
2D地理位置索引的取值范围以及表示方法 经纬度[经度,纬度]
经纬度取值范围:经度[-180,180] 纬度[-90,90]
1. 2D索引
创建
db.collection.ensureIndex({w:"2d"})
插入
db.collection.insert({w:[180,90]})
查询
(1) $near 查询距离某个点最近的点 ,默认返回最近的100个点
db.collection.find({w:{$near:[x,y]}})
(2) $geoWithin查询某个形状内的点
#查询矩形中的点
db.collection.find({w:{$geoWithin:{$box:[[0,0],[3,3]]}}})
#查询圆中的点
db.collection.find({w:{$geoWithin:{$center:[[0,0],5]}}})
#查询多边形中的点
db.collection.find({w:{$geoWithin:{$polygon:[[0,0],[0,1],[2,5],[6,1]]}}})
(3)geoNear查询
#2d索引不支持minDistance
#num:返回数量
db.runCommand({geoNear:"collection名称",near:[x, y],minDistance:10,maxDistance:10,num:1...})
2. 2Dsphere索引
创建
db.collection.ensureIndex({w:"2dsphere"})
插入
#位置格式
{type:"Point/LineString/Polygon",coordinates:[x,y]}
db.sphere.insert({name:"A",sp:{type:"Point",coordinates:[105.754484701156,41.689607057699]}})
db.sphere.insert({name:"B",sp:{type:"Point",coordinates:[105.304045248031,41.783456183240]}})
db.sphere.insert({name:"C",sp:{type:"Point",coordinates:[105.084318685531,41.389027478812]}})
db.sphere.insert({name:"D",sp:{type:"Point",coordinates:[105.831388998031,41.285916385493]}})
db.sphere.insert({name:"E",sp:{type:"Point",coordinates:[106.128706502914,42.086868474465]}})
db.sphere.insert({name:"F",sp:{type:"Point",coordinates:[105.431074666976,42.009365053841]}})
db.sphere.insert({name:"G",sp:{type:"Point",coordinates:[104.705977010726,41.921549795110]}})
查询
#2dsphere索引支持minDistance
#num:返回数量
db.runCommand({
geoNear:"collection名称",
near:{type:"Point/LineString/Polygon",coordinates:[x,y]},
minDistance:10,
maxDistance:10,
num:1,
...})