MongoDB索引

准备阶段
插入10W条数据测试准备:

插入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"}}) #空格代表或操作,aabbcc

db.age.find({$text:{$search:"aa bb -cc"}}) #-号为非操作,即不包含ccdb.age.find({$text:{$search: "\"aa\" \"bb\" \"cc\""}}) #""号为与操作,aabbcc
查询返回相似度
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...})

goNear查询

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,
...})

>>>2Dsphere索引实践>>>

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值